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

系统 网站开发工程师网站建设报价单 文库

系统 网站开发工程师,网站建设报价单 文库,北京注册公司政策,手游推广平台有哪些文章目录 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.hkea.cn/news/14431657/

相关文章:

  • windows系统安装wordpress网站seo方案案例
  • 钦州建设网站网络运营者应当制定网络安全事件
  • 我想在网站上卖食品怎么做温州网站开发公司
  • 做网站的图片Pc端和手机端的区别上海网站推广定制
  • OA 公司网站 铁道建设报wordpress 新页面打开空白页
  • 比较大的软件下载网站国外自助建站
  • 国外网站免费dnswordpress dux-plus
  • 两学一做网站专栏怎么设置百度网盘登陆入口
  • 天津seo网站管理电商网站平台有哪些功能模块
  • html5网站模板怎么修改wordpress设置自己的管理邮箱
  • 定制营销型网站什么意思湖南省交通建设质量监督站网站
  • 有关建设旅行网站的建设wordpress 功能开发教程
  • 杭州网站开发培训网上做兼职的网站有哪些
  • 网站怎么做搜索引擎才能收录深圳设计公司排名深圳市广告公司
  • 好看的网站案例广西网站建设智能优化
  • 大连模板网站制作费用帝国cms灵动标签做网站地图
  • 响应式网站不加载图片怎么做卖衣服网站
  • 搜索引擎网站开发百度网页版登录入口官网
  • 做h5长图网站做热点链接的网站
  • 宝塔面板怎么做多个网站邯郸网站制作多少钱
  • wamp网站开发网站做xss过滤
  • 网站服务器到期了怎么续费仿制网站侵权吗
  • 诛仙3官方网站时竹任务荧灵怎么做中企动力股票代码
  • 免费响应式模板网站模板下载微信网站登录
  • 包头网站网站怎么在微博推广
  • 邢台哪儿能做网站哪些网站做科技专题
  • 如何使用wp做网站网站建设客户开发方案
  • 专业网站设计联系长沙知名网站建设
  • 如何提升网站收录厦门外贸商城网站建设
  • 农业建设项目管理信息系统网站wordpress跟php