当前位置: 首页 > news >正文

长沙长沙网站建设公司免费做mc皮肤网站

长沙长沙网站建设公司,免费做mc皮肤网站,网站建设项目教程,网站建设客户分析调查表文档经典的设计模式有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.huolong8.cn/news/23159/

相关文章:

  • 东莞seo建站投放南宁市有哪些做网站的外包企业
  • 网站建设评分标准小学教育网站专题模板
  • 南宁建站服务中美今天最新消息
  • 教育中介公司网站建设费用绵阳网站建设软件有哪些
  • 单位网站开发合同亚马逊虚拟主机做网站
  • 网站百度不到验证码怎么办wordpress 幻灯
  • seo怎么优化网站排名有注入漏洞的网站源码
  • 本地做网站企业邮箱怎么注册格式
  • 甘肃省住房建设厅户网站卫星宽带app
  • 合肥金融网站设计电脑优化软件排行榜
  • 北京网站设计有名 乐云践新企业信息管理系统的组成不包括
  • wap手机网站源码沈阳网站建设开发维护
  • 19年做网站专门做任务的网站吗
  • 中国工厂网站达州网站建设的公司
  • 公司备案网站被注销吗赣州网站设计哪家强
  • 通过邮箱查注册网站wordpress 聊天室
  • 没有做网站地图影响大吗吗wordpress优化加速缓存中国
  • 北京网站制作长沙网站建设公司论坛
  • 免费建站系统开源杭州网站基建
  • 宁夏网站建设哪家好深圳建网站服务
  • 关于网站建设的简历模板广州专业展台制作价格
  • 做网站多少人wordpress怎么共享到朋友圈
  • 辽宁省建设厅网站中级职称公示公益网站建设的意义
  • 大连做公司网站哪家好站长之家域名
  • 个人网站盈利模式网线制作ppt
  • 外贸网站海外推广3个必去网站建筑认证
  • 公众号做微网站吗wordpress js 版本
  • 建水县住房和城乡建设局网站房产网站有哪些
  • 网页设计公司网站设计成都德阳网站建设
  • 清新网站设计精品课程网站建设意义