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

广州招聘网网站开发h5制作软件app

广州招聘网网站开发,h5制作软件app,深圳市网站设计公,wordpress 分享到插件文章目录 1、观察者模式2、示例3、spring中的观察者模式3.1 spring观察者模式的使用3.2 spring观察者模式原理解析 1、观察者模式 观察者模式#xff08;Observer Design Pattern#xff09;,也叫做发布订阅模式#xff08;Publish-Subscribe Design Pattern#xff09;、模… 文章目录 1、观察者模式2、示例3、spring中的观察者模式3.1 spring观察者模式的使用3.2 spring观察者模式原理解析 1、观察者模式 观察者模式Observer Design Pattern,也叫做发布订阅模式Publish-Subscribe Design Pattern、模型-视图Model-View模式、源-监听器Source-Listener模式、从属者Dependents模式 观察者允许一个对象将其状态的改变通知其他对象。实际上主要的部分就是观察者和被观察者比如前言提到的消息发布就属于被观察者而各种不同的平台消息提醒则是一系列的观察者。 模型 //观察者接口 public interface Observer {/**声明响应方法被观察者调用以达到通知的作用*/void response(); }//观察者实现类 public class ConcreteObserver1 implements Observer{Overridepublic void response() {System.out.println(我是具体观察者ConcreteObserver1);} }public class ConcreteObserver2 implements Observer{Overridepublic void response() {System.out.println(我是具体观察者ConcreteObserver2);} }//观察者抽象类 public abstract class Subject {//存储注册的观察者protected ListObserver observerList new ArrayListObserver();/*** 增加观察者* param observer 观察者*/public void add(Observer observer) {observerList.add(observer);}/*** 注销观察者从观察者集合中删除一个观察者* param observer 观察者*/public void remove(Observer observer) {observerList.remove(observer);}/**通知观察者*/public abstract void notifyObserver();}//被观察者实现类 public class ConcreteSubject extends Subject {Overridepublic void notifyObserver() {System.out.println(遍历观察者);for (Observer observer : observerList) {observer.response();}} }//客户端测试类 public class Client {public static void main(String[] args) {Subject subject new ConcreteSubject();//项目中这些内容一般在new Subject对象启动时自动加载subject.add(new ConcreteObserver1());subject.add(new ConcreteObserver2());subject.notifyObserver();} }观察者注册到被观察者中然后通过被观察者调用观察者的方法达到通知的效果 实际中会有多个观察者以及多个事件每个观察者关注不同的事件待相对应事件发生时通知关注改时间的观察者 2、示例 宝马公司偶尔推出打折或立减活动(8折、9折、立减5000)不同的用户关注不同的活动如用户1关注8折和9折活动用户2关注8折和立减5000活动用户3这些活动都关注当宝马公司推出一种活动的时候立刻通知到关注该活动的用户 //活动(事件) Getter public enum EventEnum {eightDisc(1, 8折),nineDisc(2, 9折),subFiveThous(3, 立减5000元);private Integer code;private String value;public static EventEnum getEventEnum(Integer code){for(EventEnum event : values()){if(event.code.equals(code)){return event;}}return null;}public static EventEnum getEventEnum(String value){for(EventEnum event : values()){if(event.getValue().equals(value)){return event;}}return null;}public String getValue(Integer code){for(EventEnum event : values()){if(event.code.equals(code)){return event.getValue();}}return null;}public Integer getCode(String value){for(EventEnum event : values()){if(event.getValue().equals(value)){return event.getCode();}}return null;}EventEnum(Integer code, String value) {this.code code;this.value value;}public void setCode(Integer code) {this.code code;}public void setValue(String value) {this.value value;} }//客户(观察者) public interface Consumer {void response(EventEnum event); } public class ConcreteConsumer1 implements Consumer{Overridepublic void response(EventEnum event) {System.out.println(ConcreteConsumer1 已知悉 宝马公司 event.getValue() 活动);} } public class ConcreteConsumer2 implements Consumer{Overridepublic void response(EventEnum event) {System.out.println(ConcreteConsumer2 已知悉 宝马公司 event.getValue() 活动);} } public class ConcreteConsumer3 implements Consumer {Overridepublic void response(EventEnum event) {System.out.println(ConcreteConsumer3 已知悉 宝马公司 event.getValue() 活动);} }//宝马公司(被观察者) public abstract class BMWCompany {MapEventEnum, ListConsumer eventMap new HashMap();//客户注册关注事件public BMWCompany(){Consumer consumer1 new ConcreteConsumer1();Consumer consumer2 new ConcreteConsumer2();Consumer consumer3 new ConcreteConsumer3();registerConsumerEvent(consumer1, EventEnum.getEventEnum(1));registerConsumerEvent(consumer1, EventEnum.getEventEnum(2));registerConsumerEvent(consumer2, EventEnum.getEventEnum(2));registerConsumerEvent(consumer2, EventEnum.getEventEnum(3));registerConsumerEvent(consumer3, EventEnum.getEventEnum(1));registerConsumerEvent(consumer3, EventEnum.getEventEnum(2));registerConsumerEvent(consumer3, EventEnum.getEventEnum(3));}public void registerConsumerEvent(Consumer consumer,EventEnum event){ListConsumer consumers eventMap.getOrDefault(event, new ArrayList());consumers.add(consumer);eventMap.put(event, consumers);}public void removeConsumer(Consumer consumer){for(ListConsumer consumerList : eventMap.values()){consumerList.remove(consumer);}}public abstract void notifyConsumer(EventEnum event); }public class DiscountManage extends BMWCompany{Overridepublic void notifyConsumer(EventEnum event) {ListConsumer consumers eventMap.get(event);if(!CollectionUtils.isEmpty(consumers)){consumers.forEach(consumer - consumer.response(event));}else{System.out.println(无人关注 event.getValue() 活动);}} }//客户端测试类 public class Client {public static void main(String[] args) {BMWCompany discountManage new DiscountManage();discountManage.notifyConsumer(EventEnum.getEventEnum(3));} }该示例中生成被观察者对象时构造函数将观察者与其关注的事件放入到map中key为事件value为关注该事件的用户 也就是说由被观察者管理事件和观察者之间的关系观察者面向被观察者由被观察者管理被观察者亲自通知观察者 以上就是观察者模式与发布订阅模式发布订阅模式有专门的组件管理事件和观察者之间的关系被观察者发布事件到事件组件无需关心谁订阅了哪些事件观察者面向事件组件订阅事件不关心谁发布的事件 3、spring中的观察者模式 以上示例中我们需要在创建被观察者实例时自己写代码创建观察者和事件之间的关系当新增事件和观察者的时候要在BMWCompany()构造函数中再新增语句那么可不可以只提供事件、观察者以及观察者所关注的事件组装的事情由spring自动完成 3.1 spring观察者模式的使用 示例平台用户注册成功时为用户发送邮件并发放优惠券平台用户销毁账户时发送邮件和消息 一般模型 //邮件业务接口和实现类 public interface EmailService {void onRegister(String name);void onDestory(String name); } public class EmailServiceImpl implements EmailService {Overridepublic void onRegister(String name) {log.info(邮件: 尊敬的 name 先生/女士恭喜注册成功);}Overridepublic void onDestory(String name) {log.info(邮件: 尊敬的 name 先生/女士很遗憾您销毁账号);} }//优惠券业务接口和实现类 public interface CouponService {void onRegister(String name); } Slf4j Service public class CouponServiceImpl implements CouponService {Overridepublic void onRegister(String name) {log.info(优惠券: 尊敬的 name 先生/女士恭喜注册成功赠送您100元代金券);} }//消息业务接口和实现类 public interface MessageService {void onDestory(String name); } Slf4j Service public class MessageServiceImpl implements MessageService {Overridepublic void onDestory(String name) {log.info(信息: 尊敬的 name 先生/女士很遗憾您销毁账号);} }//用户业务接口和实现类 public interface UserService {void register(String name);void destroy(String name); } Slf4j Service public class UserServiceImpl implements UserService {AutowiredEmailService emailService;AutowiredMessageService messageService;AutowiredCouponService couponService;Overridepublic void register(String name) {//执行各种校验动作入库操作//doRegister(name);log.info(name 的注册逻辑......);//发送邮件emailService.onRegister(name);//发送优惠券couponService.onRegister(name);}Overridepublic void destroy(String name) {//执行销毁账号操作//doDestory(name);log.info(name 的销毁逻辑......);//发送邮件emailService.onDestory(name);//发送短信messageService.onDestory(name);} }如上所示如果订阅者很多那么在用户业务实现类中要添加所有的相关订阅者引用并且在方法中通知所有对应的订阅者 spring中发布订阅模式: //注册事件 public class UserRegisterEvent extends ApplicationEvent {private String username;public UserRegisterEvent(Object source) {super(source);}public UserRegisterEvent(Object source, String username) {super(source);this.username username;}public String getUsername() {return username;} }//销毁事件 public class UserDestoryEvent extends ApplicationEvent {private String username;public UserDestoryEvent(Object source) {super(source);}public UserDestoryEvent(Object source, String username) {super(source);this.username username;}public String getUsername() {return username;} }//邮件业务实现类 Slf4j Service public class EmailServiceImpl implements EmailService {//实现监听者(订阅者)的一种方式---方法上添加EventListener注解可实现一个类中订阅多个事件EventListenerpublic void onRegister(UserRegisterEvent userRegisterEvent) {log.info(邮件: 尊敬的 userRegisterEvent.getUsername() 先生/女士恭喜注册成功);}EventListenerpublic void onDestory(UserRegisterEvent userRegisterEvent) {log.info(邮件: 尊敬的 userRegisterEvent.getUsername() 先生/女士很遗憾您销毁账号);} }//优惠券业务实现类 Slf4j Service public class CouponServiceImpl implements CouponService, ApplicationListenerUserRegisterEvent {//第二种实现监听者(订阅者)的方式实现ApplicationListener接口的onApplicationEvent方法Overridepublic void onApplicationEvent(UserRegisterEvent userRegisterEvent) {log.info(优惠券: 尊敬的 userRegisterEvent.getUsername() 先生/女士恭喜注册成功赠送您100元代金券);} }//消息业务实现类 Slf4j Service public class MessageServiceImpl implements MessageService, ApplicationListenerUserDestoryEvent {Overridepublic void onApplicationEvent(UserDestoryEvent userDestoryEvent) {log.info(信息: 尊敬的 userDestoryEvent.getUsername() 先生/女士很遗憾您销毁账号);} }//用户业务实现类 Slf4j Service public class UserServiceImpl implements UserService, ApplicationEventPublisherAware {private ApplicationEventPublisher applicationEventPublisher;Overridepublic void setApplicationEventPublisher(NotNull ApplicationEventPublisher applicationEventPublisher) {this.applicationEventPublisher applicationEventPublisher;}Overridepublic void register(String name) {//执行各种校验动作入库操作//doRegister(name);log.info(name 的注册逻辑......);//发布注册事件applicationEventPublisher.publishEvent(new UserRegisterEvent(this, name));}Overridepublic void destroy(String name) {//执行销毁账号操作//doDestory(name);log.info(name 的销毁逻辑......);//发布销毁事件applicationEventPublisher.publishEvent(new UserDestoryEvent(this, name));} }由上所示我们只需要编写事件、订阅者逻辑即可具体的订阅者和事件之间的关系有spring来建立关联 每当事件发生时spring获取订阅该事件的类去执行相对应的处理方法 3.2 spring观察者模式原理解析 当发布者执行applicationEventPublisher.publishEvent(new UserRegisterEvent(this, name));时spring会一直执行到SimpleApplicationEventMulticaster.multicastEvent(ApplicationEvent event, Nullable ResolvableType eventType)方法 public void multicastEvent(ApplicationEvent event, Nullable ResolvableType eventType) {ResolvableType type eventType ! null ? eventType : this.resolveDefaultEventType(event);Executor executor this.getTaskExecutor();Iterator var5 this.getApplicationListeners(event, type).iterator();while(var5.hasNext()) {ApplicationListener? listener (ApplicationListener)var5.next();if (executor ! null) {executor.execute(() - {this.invokeListener(listener, event);});} else {this.invokeListener(listener, event);}} }由上可知spring也是通过事件获取所有关注该事件的监听器依次执行订阅处理逻辑 具体spring执行逻辑参考 Spring观察监听器-ApplicationEventPublisher的publishEvent实现异步事件解耦业务
http://www.dnsts.com.cn/news/165664.html

相关文章:

  • 镇江建设集团网站网站建立需要什么
  • 专业建站源码wordpress仿 模板
  • 某公司网站策划建设网站建设技术网站建设
  • 洛阳霞光建设网站网站建设构想
  • wordpress 本地 搭建网站凡科网站可以做seo优化
  • 太原建站网站模板建网站的支付安全
  • 南京百度网站快速优化天津百度建网站
  • 湛江网站制作江网站制作静态页面加wordpress
  • 装饰公司营销网站建设设计师网站十大网站
  • 沙田东莞网站建设免费做网站有哪些
  • 常德天鹰建设有限公司网站从化营销网站建设
  • 在哪网站建设手机优化怎么关闭
  • 企业网站管理系统 软件著作权注册公司费用深圳
  • 企业网站做的好网站前期准备
  • 凡客vancl的网站标题2018做网站 工具
  • 上海专业网站建设渠道网址提交大全
  • 公司的论坛与网站绑定网站如何做收款二维码
  • 网站建设最新时讯如何加强门户网站建设
  • 做网站策划薪酬娱乐网站 建站软件
  • 搜狗网站提交万网企业邮箱登陆界面如何嵌入到自己的网站
  • 网站模块源码设计方案表网站名称
  • 中国建设教育网站网站的二维码怎么做
  • 自己做一个网站需要什么网站建设哪里找
  • 网站怎么制作商城网站建设的主要工作有哪些
  • 网站建设制作浩森宇特前端开发工程师是什么专业
  • google收录网站百度seo权重
  • 网站开发宣传图片wordpress分类目录标题使用自定义
  • 怎么做网络乞丐网站百度app营销软件
  • 做网站 需要了解什么网站域名免费申请
  • 山东网站建设是什么企业网站策划书