设计模式之观察者模式

来源:互联网 发布:淘宝网钢琴防潮管 编辑:程序博客网 时间: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
原创粉丝点击