设计模式之观察者模式

xiaoxiao2021-02-28  78

描述:战国时期,秦始皇为了监视各诸侯国,吩咐李斯派卧底监视韩国韩非子。韩非子一有情况卧底就会通知给李斯,李斯就向秦始皇汇报当前情况;这样的模式被称之为观察者模式。韩非子就是所谓的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 { @Override public void update(String str) { System.out.println("准备向秦始皇汇报..."); System.out.println(str); System.out.println("向秦始皇汇报完毕!"); } }

package com.java.observer; public class WangSiObserver implements Observer { @Override public 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; @Override public void attach(Observer observer) { if(list == null){ list = new ArrayList<Observer>(); } list.add(observer); } @Override public void detach(Observer observer) { if(list == null || list.size() == 0){ return; } list.remove(observer); } @Override public 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、测试结果

准备向秦始皇汇报... 韩非子哭了! 向秦始皇汇报完毕! 准备向刘备汇报... 韩非子哭了! 向刘备汇报完毕! 准备向秦始皇汇报... 韩非子笑了! 向秦始皇汇报完毕! 准备向刘备汇报... 韩非子笑了! 向刘备汇报完毕!

转载请注明原文地址: https://www.6miu.com/read-58552.html

最新回复(0)