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

陕西网站建设公司哪有厦门seo培训

陕西网站建设公司哪有,厦门seo培训,怎样网站建设,网站外部链接如何建设引言 在软件开发中,我们经常面临需要在多个对象之间进行通信的挑战。特别是当一个对象的状态发生变化时,我们希望所有依赖于这个状态的对象都能自动更新。这就是观察者设计模式大显身手的地方。 简介 观察者模式是一种行为设计模式,它定义…

引言

在软件开发中,我们经常面临需要在多个对象之间进行通信的挑战。特别是当一个对象的状态发生变化时,我们希望所有依赖于这个状态的对象都能自动更新。这就是观察者设计模式大显身手的地方。

简介

观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。

核心组件

  • Subject(主题):也称为Observable,它维护一组观察者,提供添加、删除和通知观察者的接口;
  • Observer(观察者):为所有具体观察者定义一个接口,在得到主题的通知时更新自己;
  • ConcreteSubject(具体主题):保存状态,当状态变化时通知观察者;
  • ConcreteObserver(具体观察者):实现观察者更新接口,以便在主题状态变化时更新自己。

经典实现

// 主题-被观察者
public interface Subject {void registerObserver(Observer observer); //注册观察者void removeObserver(Observer observer); //移除观察者void notifyObservers(Message message); //通知观察者
}
// 观察者
public interface Observer {void update(Message message);
}public class ConcreteSubject implements Subject {private List<Observer> observers = new ArrayList<Observer>();@Overridepublic void registerObserver(Observer observer) {observers.add(observer);}@Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}@Overridepublic void notifyObservers(Message message) {for (Observer observer : observers) {observer.update(message);}}
}//观察者1
public class ConcreteObserverOne implements Observer {@Overridepublic void update(Message message) {//TODO: 获取消息通知,执行自己的逻辑...System.out.println("ConcreteObserverOne is notified.");}
}
//观察者2
public class ConcreteObserverTwo implements Observer {@Overridepublic void update(Message message) {//TODO: 获取消息通知,执行自己的逻辑...System.out.println("ConcreteObserverTwo is notified.");}
}public class Demo {public static void main(String[] args) {ConcreteSubject subject = new ConcreteSubject();subject.registerObserver(new ConcreteObserverOne());subject.registerObserver(new ConcreteObserverTwo());subject.notifyObservers(new Message());}
}

投资理财系统

比如,我们现在在开发一个投资理财系统,用户注册成功后,会给用户发放投资体验金,代码实现大致如下:

public class UserController {private UserService userService; // 依赖注入private PromotionService promotionService; // 依赖注入public Long register(String telephone, String password) {// 注册long userId = userService.register(telephone, password);// 发放体验金promotionService.issueNewUserExperienceCash(userId);return userId;}
}

假如没有扩展修改的需求,那么现在的代码是可以被接受的。如果非得用观察者模式,就会引入更多的类和更加复杂的代码结构,反而是一种过度设计

相反,假如需求频繁改动,比如用户注册成功后,不再发放体验金,而是改为发放优惠券,且给用户发送一封“注册成功”的站内信。此时,就需要频繁修改register函数的代码,违反开闭原则。
而且,如果注册成功后需要执行的后续操作越来越多,那register函数也会越来越复杂,影响代码的可读性和可维护性。

同步阻塞实现

//观察者接口
public interface RegObserver {void handleRegSuccess(long userId);
}//观察者1
public class RegPromotionObserver implements RegObserver {private PromotionService promotionService; // 依赖注入@Overridepublic void handleRegSuccess(long userId) {promotionService.issueNewUserExperienceCash(userId);}
}
//观察者2
public class RegNotificationObserver implements RegObserver {private NotificationService notificationService;@Overridepublic void handleRegSuccess(long userId) {notificationService.sendInboxMessage(userId, "Welcome...");}
}public class UserController {private UserService userService; // 依赖注入private List<RegObserver> regObservers = new ArrayList<>();// 设置观察者public void setRegObservers(List<RegObserver> observers) {regObservers.addAll(observers);}public Long register(String telephone, String password) {long userId = userService.register(telephone, password);//通知观察者for (RegObserver observer : regObservers) {observer.handleRegSuccess(userId);}return userId;}
}

被观察者代码和观察者代码在同一个线程中执行,被观察者代码一直阻塞,直到所有的观察者代码都执行完毕后,才执行后续的代码。
register函数依次调用执行每个观察者的handleRegSuccess函数,都执行完成后,才会返回结果给客户端。

异步非阻塞实现

如果注册接口是一个调用非常频繁的接口,对性能非常敏感,希望接口的响应时间尽可能的短,可以将同步阻塞的实现方式改为异步非阻塞的实现方式,以此来减少响应时间。
register函数执行完成后,启动一个新的线程来执行观察者的handleRegSuccess函数。

跨进程实现

同步阻塞和异步非阻塞都是进程内的实现方式。
而基于消息队列实现的方式则属于一个跨进程的实现方式,观察者和被观察者解耦的更加彻底,两者都感知不到对方的存在。被观察者只管发送消息到消息队列,观察者只管从消息队列中读取消息来执行相应的逻辑。
在这里插入图片描述

总结

观察者模式提供了一种强大的方法来实现对象之间的松耦合通信。它允许系统在不修改现有代码的情况下,通过增加新的观察者来扩展其功能。通过使用观察者模式,我们可以构建出更加灵活、可维护和响应式的软件系统。

参考文献
《极客时间-设计模式之美》

http://www.hkea.cn/news/725/

相关文章:

  • 广州网站建设 广州亦客网络百度收录网站要多久
  • 在北京做兼职哪个网站好国内搜索引擎
  • 电子商务之网站建设最佳磁力吧ciliba磁力链
  • 建立单页网站河南靠谱seo电话
  • 深圳集团网站开发徐州seo招聘
  • 宣城有木有专业做网站的关键词查询网站
  • 赞美对方公司网站做的好的日语网络营销推广方案ppt
  • 毕业设计网站只做前端行不行武汉网站seo推广公司
  • 东营建设信息网站百度网站收录
  • 整人关不掉的网站怎么做企业网站推广注意事项
  • 加强全国政府网站建设监督检查seo优化咨询
  • 番禺附近网站建设推广定制企业网站建设制作
  • 网站备案简单吗口碑营销案例有哪些
  • 佛山外贸网站设计百度网站怎样优化排名
  • 沈阳建设工程信息网还需要造价员广州seo优化公司排名
  • 杭州企业网站制作百度收录查询方法
  • 新汉阳火车站最新消息权威发布怎么做百度搜索排名
  • 各国网站域名今日新闻国家大事
  • vs2010做网站windows10优化大师
  • 手机网站开发入门搜一下百度
  • html5网站开发软件邀请注册推广赚钱的app
  • 伊犁州住房城乡建设局网站怎样做品牌推广
  • 课程网站建设的设计报告网络营销与推广
  • 兰州新区城乡建设局网站重庆seo黄智
  • 海口网站制作苏州百度推广代理商
  • 郑州网站建设+论坛宁波关键词优化排名工具
  • php建设网站教程电工培训内容
  • 做58类网站需要多少钱百度广告联盟收益
  • 万彩动画大师市场seo是什么意思
  • 手机端自适应网站布局成都正规搜索引擎优化