设计模式之观察者模式
来源:互联网 发布:淘宝网钢琴防潮管 编辑:程序博客网 时间:2024/06/08 00:03
描述:战国时期,秦始皇为了监视各诸侯国,吩咐李斯派卧底监视韩国韩非子。韩非子一有情况卧底就会通知给李斯,李斯就向秦始皇汇报当前情况;这样的模式被称之为观察者模式。韩非子就是所谓的Subject(被观察者),李斯就是Observer(观察者),观察者可以是多个。有了观察者和被观察者还不够,必须通过卧底来连接观察者和被观察者,也就是说李斯必须将自己的卧底派到韩国盯着韩非子,韩非子一有情况就派卧底通知李斯。
Subject: 被观察者也称主题
Observer: 观察者也称订阅者
具体代码如下所示:
1、观察者接口类
package com.java.observer;public interface Observer {public void update(String str);}
2、观察者实现类,
package com.java.observer;public class SiObserver implements Observer {@Overridepublic void update(String str) {System.out.println("准备向秦始皇汇报...");System.out.println(str);System.out.println("向秦始皇汇报完毕!");}}
package com.java.observer;public class WangSiObserver implements Observer {@Overridepublic void update(String str) {System.out.println("准备向刘备汇报...");System.out.println(str);System.out.println("向刘备汇报完毕!");}}
3、被观察者抽象类
package com.java.observer;public abstract class Subject {public abstract void attach(Observer observer);public abstract void detach(Observer observer);public abstract void notifyObserver();}
4、被观察者实现类
package com.java.observer;import java.util.ArrayList;import java.util.List;public class HanFeiZiSubject extends Subject {private List<Observer> list;private String content;@Overridepublic void attach(Observer observer) {if(list == null){list = new ArrayList<Observer>();}list.add(observer);}@Overridepublic void detach(Observer observer) {if(list == null || list.size() == 0){return;}list.remove(observer);}@Overridepublic void notifyObserver() {if(list != null && list.size() > 0){for(Observer or : list){or.update(content);}}}public void haveCry(){this.content = "韩非子哭了!";notifyObserver();}public void haveSmile(){this.content = "韩非子笑了!";notifyObserver();}}
5、测试类
package com.java.observer;public class ObserverTest {public static void main(String[] args) {LiSiObserver observer1 = new LiSiObserver();WangSiObserver observer2 = new WangSiObserver();HanFeiZiSubject subject = new HanFeiZiSubject();subject.attach(observer1);subject.attach(observer2);subject.haveCry();subject.haveSmile();subject.detach(observer1);subject.detach(observer2);}}
6、测试结果
准备向秦始皇汇报...韩非子哭了!向秦始皇汇报完毕!准备向刘备汇报...韩非子哭了!向刘备汇报完毕!准备向秦始皇汇报...韩非子笑了!向秦始皇汇报完毕!准备向刘备汇报...韩非子笑了!向刘备汇报完毕!
0 0
- 设计模式之-观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- js 解决js for 循环中的闭包问题
- python之字典
- ZOJ-1091-Knight Moves
- 这不是我想要的ABAP开发者
- poj 1743
- 设计模式之观察者模式
- hdu2874—Connections between cities(LCA)
- SSH(Struts2+Spring4+Hibernate5)示例
- 通过中序遍历、后序遍历求先序遍历
- CTA策略:主力连续、全合约模式下回测结果的差异探讨
- Vue H5 History 部署IIS上404问题
- 经典算法求字符串的编辑距离
- 实用站点收集——持续更新
- 查询条件样式的PopWindow