正规的郑州网站建设软件开发网站开发培训

bicheng/2026/1/21 14:22:03/文章来源:
正规的郑州网站建设,软件开发网站开发培训,婚恋网站建设成本,网站设计咨询经典的设计模式有23种#xff0c;但是常用的设计模式一般情况下不会到一半#xff0c;我们就针对一些常用的设计模式进行一些详细的讲解和分析#xff0c;方便大家更加容易理解和使用设计模式。 23种经典的设计模式分为三类#xff1a;创建型、结构型、行为型。前面我们已经…       经典的设计模式有23种但是常用的设计模式一般情况下不会到一半我们就针对一些常用的设计模式进行一些详细的讲解和分析方便大家更加容易理解和使用设计模式。 23种经典的设计模式分为三类创建型、结构型、行为型。前面我们已经学习了创建型和结构型从今天起我们开始学习行为型设计模式。创建型设计模式主要解决“对象的创建”问题结构型设计模式主要解决“类或对象的组合或组装”问题那行为型设计模式主要解决的就是“类或对象之间的交互”问题。 行为型设计模式比较多有11个几乎占了23种经典设计模式的一半。它们分别是观察者模式、模板模式、策略模式、职责链模式、状态模式、迭代器模式、访问者模式、备忘录模式、命令模式、解释器模式、中介模式。 1-观察者模式原理 观察者模式Observer Design Pattern也被称为发布订阅模式Publish-Subscribe Design Pattern。在GoF的《设计模式》一书中它的定义是这样的 Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.        翻译成中文就是在对象之间定义一个一对多的依赖当一个对象状态改变的时候所有依赖的对象都会自动收到通知。 2-观察者设计模式示例 假设我们在开发一个P2P投资理财系统用户注册成功之后我们会给用户发放投资体验金。代码实现大致是下面这个样子的 public class UserController {private UserService userService; // 依赖注入private PromotionService promotionService; // 依赖注入public Long register(String telephone, String password) {//省略输入参数的校验代码//省略userService.register()异常的try-catch代码long userId userService.register(telephone, password);promotionService.issueNewUserExperienceCash(userId);return userId;} 虽然注册接口做了两件事情注册和发放体验金违反单一职责原则但是如果没有扩展和修改的需求现在的代码实现是可以接受的。如果非得用观察者模式就需要引入更多的类和更加复杂的代码结构反倒是一种过度设计。 相反如果需求频繁变动比如用户注册成功之后不再发放体验金而是改为发放优惠券并且还要给用户发送一封“欢迎注册成功”的站内信。这种情况下我们就需要频繁地修改register()函数中的代码违反开闭原则。而且如果注册成功之后需要执行的后续操作越来越多那register()函数的逻辑会变得越来越复杂也就影响到代码的可读性和可维护性。 这个时候观察者模式就能派上用场了。利用观察者模式我对上面的代码进行了重构。 public interface RegObserver {void handleRegSuccess(long userId); }public class RegPromotionObserver implements RegObserver {private PromotionService promotionService; // 依赖注入Overridepublic void handleRegSuccess(long userId) {promotionService.issueNewUserExperienceCash(userId);} }public class RegNotificationObserver implements RegObserver {private NotificationService notificationService;Overridepublic void handleRegSuccess(long userId) {notificationService.sendInboxMessage(userId, Welcome...);} }public class UserController {private UserService userService; // 依赖注入private ListRegObserver regObservers new ArrayList();// 一次性设置好之后也不可能动态的修改public void setRegObservers(ListRegObserver observers) {regObservers.addAll(observers);}public Long register(String telephone, String password) {//省略输入参数的校验代码//省略userService.register()异常的try-catch代码long userId userService.register(telephone, password);for (RegObserver observer : regObservers) {observer.handleRegSuccess(userId);}return userId;} } 3-异步非阻塞方式 以上的实现方式它是一种同步阻塞的实现方式。观察者和被观察者代码在同一个线程内执行被观察者一直阻塞直到所有的观察者代码都执行完成之后才执行后续的代码。对照上面讲到的用户注册的例子register()函数依次调用执行每个观察者的handleRegSuccess()函数等到都执行完成之后才会返回结果给客户端。如果要求对接口性能比较高希望接口的响应时间尽可能短那我们可以将同步阻塞的实现方式改为异步非阻塞的实现方式以此来减少响应时间。 我们可以采用异步方式进行我们可以采用java的新创建线程来改造 // 第一种实现方式其他类代码不变就没有再重复罗列 public class RegPromotionObserver implements RegObserver {private PromotionService promotionService; // 依赖注入Overridepublic void handleRegSuccess(long userId) {Thread thread new Thread(new Runnable() {Overridepublic void run() {promotionService.issueNewUserExperienceCash(userId);}});thread.start();} }// 第二种实现方式其他类代码不变就没有再重复罗列 public class UserController {private UserService userService; // 依赖注入private ListRegObserver regObservers new ArrayList();private Executor executor;public UserController(Executor executor) {this.executor executor;}public void setRegObservers(ListRegObserver observers) {regObservers.addAll(observers);}public Long register(String telephone, String password) {//省略输入参数的校验代码//省略userService.register()异常的try-catch代码long userId userService.register(telephone, password);for (RegObserver observer : regObservers) {executor.execute(new Runnable() {Overridepublic void run() {observer.handleRegSuccess(userId);}});}return userId;} } 对于第一种实现方式频繁地创建和销毁线程比较耗时并且并发线程数无法控制创建过多的线程会导致堆栈溢出。第二种实现方式尽管利用了线程池解决了第一种实现方式的问题但线程池、异步执行逻辑都耦合在了register()函数中增加了这部分业务代码的维护成本。 4-EventBus Google Guava EventBus就是一个比较著名的EventBus框架它不仅仅支持异步非阻塞模式同时也支持同步阻塞模式。 public class UserController {private UserService userService; // 依赖注入private EventBus eventBus;private static final int DEFAULT_EVENTBUS_THREAD_POOL_SIZE 20;public UserController() {//eventBus new EventBus(); // 同步阻塞模式eventBus new AsyncEventBus(Executors.newFixedThreadPool(DEFAULT_EVENTBUS_THREAD_POOL_SIZE)); // 异步非阻塞模式}public void setRegObservers(ListObject observers) {for (Object observer : observers) {eventBus.register(observer);}}public Long register(String telephone, String password) {//省略输入参数的校验代码//省略userService.register()异常的try-catch代码long userId userService.register(telephone, password);eventBus.post(userId);return userId;} }public class RegPromotionObserver {private PromotionService promotionService; // 依赖注入Subscribepublic void handleRegSuccess(long userId) {promotionService.issueNewUserExperienceCash(userId);} }public class RegNotificationObserver {private NotificationService notificationService;Subscribepublic void handleRegSuccess(long userId) {notificationService.sendInboxMessage(userId, ...);} } 利用EventBus框架实现的观察者模式跟从零开始编写的观察者模式相比从大的流程上来说实现思路大致一样都需要定义Observer并且通过register()函数注册Observer也都需要通过调用某个函数比如EventBus中的post()函数来给Observer发送消息在EventBus中消息被称作事件event。 基于EventBus我们不需要定义Observer接口任意类型的对象都可以注册到EventBus中通过Subscribe注解来标明类中哪个函数可以接收被观察者发送的消息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/88165.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深圳品牌网站推广百度推广去哪里学技术

C语言之指针知识点总结 文章目录 C语言之指针知识点总结1. 初识指针1.1 取地址操作符 &1.2 指针变量1.3 解引用操作符 *1.4 指针变量1.4.1 大小1.4.2 指针类型的意义 1.5 void*指针1.6 const关键字1.61 const修饰变量1.6.2 const修饰指针变量 1.7 指针的运算1.7.1 指针-整数…

做一个网站成本是多少网站购物车代码怎么做

在品牌发展的道路上,产品质量的把控非常重要,关系到品牌的竞争力,但品牌要长期发展,产品要获得市场足够份额,还需要有稳定的价格体系做支撑,这个价格不是仅凭品牌单方面的定价而定,而是整个渠道…

东莞教育团购网站建设网页版传奇下载

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

如何做网站内链wordpress编辑器

查看专栏目录 canvas示例教程100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…

深圳网站设计制作北京网站建设模板下载

\cong \sim \simeq 对应的Latex实现分别为: ≅ \cong ≅ ∼ \sim ∼ ≃ \simeq ≃

美食网站建设书vi设计要做什么

测试环境信息: 系统为银河麒麟V10 数据库为Kingbase ES V8 数据库安装目录为/opt/Kingbase/ES/V8 ksql命令位于/opt/Kingbase/ES/V8/Server/bin下 使用--help获取帮助 续上图 1.查看数据库列表 ./ksql -U system -l 2.查看数据库版本 ./ksql -V 3.连接指定的数据库tes…

酷播wordpress视频插件赣州网站seo

如果想要将一个文件的内容拷贝到另一个文件中,常规的做法是读取源文件,然后再把内容写入到目的文件中: #include <fstream> #include <iostream> #include <string> #include <vector>using namespace std;vector<string> readFile(const st…

怎么做自己的网站平台文化网站策划

💡该教程为改进YOLOv8指南,属于《芒果书》📚系列,包含大量的原创首发改进方式🚀 💡🚀🚀🚀本博客内含改进源代码,按步骤操作运行改进后的代码即可 💡更方便的统计更多实验数据,方便写作 新增YOLOv8打印FPS指标 完善(一键YOLOv8打印FPS指标) 文章目录 完善…

做动态的网站的参考资料有哪些动漫设计和动画设计

26题提示所有的空格和注释都会被过滤掉 输入?id0判断闭合方式&#xff0c;回显报错可以确定闭合方式为单引号 正常思路是需要通过注释符将后面的语句注释掉&#xff0c;但是这一关的注释符被过滤了&#xff0c;可以考虑使用将后面的语句也闭合的思路来避免引号带来的报错。输…

中小型企业 公司网站建设个人网站制作多少钱

seata的部署和集成 一、部署Seata的tc-server 1.下载 首先我们要下载seata-server包&#xff0c;地址在http&#x1f615;/seata.io/zh-cn/blog/download.html 当然&#xff0c;课前资料也准备好了&#xff1a; 2.解压 在非中文目录解压缩这个zip包&#xff0c;其目录结构…

学校网站建设策划方案湖南网站推广营销设计

测试题 1.(1). 对于int类型的变量&#xff0c;Java编译器和大多数C编译器都是分配4个字节的内存&#xff0c;4个字节有32个二进制位即总共可以拥有多少种状态&#xff0c;其中一半的状态用来存储负数&#xff0c;一半的状态用来存储0和正数。因此&#xff0c;int类型的变量可以…

合法购物网站建设信息港官网

目录 P1031 [NOIP2002 提高组] 均分纸牌 原题链接 : 题面 : 思路 : 代码 : P1036 [NOIP2002 普及组] 选数 原题链接 : 题面 : 思路 : 代码 : P1060 [NOIP2006 普及组] 开心的金明 原题链接 : 题面 : 思路 : 01背包例题 : 代码 : P1100 高低位交换 原题…

做搜索关键词任务网站网站开发项目说明书

“ 本文主要讨论线性表在多项式计算中的应用&#xff0c;讨论内容涉及到一元n次多项式在计算机中的表示&#xff0c;及多项式相加运算。”01在数学上&#xff0c;一个一元n次多项式可以按照升幂写成Pn(x) p0 p1x p2x2 …… pnxn它由n1个系数唯一确定。因此&#xff0c;一个…

wordpress 仿站 主题陕西城乡建设网官网

文章目录 QT安装与helloworld1.概念&#xff1a;2.安装QT3.配置环境变量4.创建项目5.运行效果 QT安装与helloworld 1.概念&#xff1a; Qt Creator是一个用于Qt开发的轻量级跨平台集成开发环境。Qt Creator可带来两大关键益处&#xff1a;提供首个专为支持跨平台开发而设计的…

学什么可以做视频网站网站开发设计的技术路线

文章目录 一、583、两个字符串的删除操作二、72、编辑距离三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、583、两个字符串的删除操作 思路分析&#xff1a;本题的思路和115、不同的子序列差不多&#xff0c;只是变成…

vs设置网站开发环境廉政网站建设

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通…

商标设计网站排行lamp 安装wordpress

在使用layui的form表单提交以后&#xff0c;请求状态总是canceled。后来在form表单的后面添加了一行代码&#xff1a; return false; 就可以了。 文档&#xff1a;https://www.layui.com/doc/modules/form.html#onsubmit 错误&#xff1a; 解决方法&#xff1a; 总结一下&…

php语言的网站建设贵阳有做网站的公司吗

1.简介在我们开发高性能代码时&#xff0c;需要各种针对性能优化进行编码。那么如何才能知道我们所加的代码是否有性能方面的正向优化呢&#xff1f;有了BenchmarkDotNet&#xff0c;做性能对比测试就非常容易了&#xff0c;只需要把你的测试方法加上特性[Benchmark], 想做不同…

网站建设与网页制作模拟试题seo入门版

平台RK3568 基线 3.2 beta 在移植Harmonys的时候发现一个问题&#xff0c;就是开机正常显示&#xff0c;uboot和kernel正常&#xff0c;开机后灭屏&#xff0c;等待系统进入Deep &#xff0c;然后按power按键唤醒设备。此时出现花屏或者不显示问题 多次测试发现&#xff0c;如…

简单的网站架构东莞房价2022最新楼盘消息

0x01 产品简介 Progress Kemp LoadMaster是一款高性能的应用交付控制器&#xff0c;具有可扩展性&#xff0c;支持实体硬件和虚拟机的负载均衡。它提供了当今应用服务所需的各种功能&#xff0c;包括深度用户验证、资安防护&#xff08;如WAF/IPS/DDoS防护&#xff09;以及零信…