首页 > 代码库 > 观察者模式
观察者模式
观察者模式(Observer):定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
Observer模式的典型应用
- 侦听事件驱动程序设计中的外部事件- 侦听/监视某个对象的状态变化
- 发布者/订阅者(publisher/subscriber)模型中,当一个外部事件(新的产品,消息的出现等等)被触发时,通知邮件列表中的订阅者
Observer模式的优点
- 对象之间可以进行同步通信- 可以同时通知一到多个关联对象
- 对象之间的关系以松耦合的形式组合,互不依赖
Observer模式的角色:
Subject(被观察者)
被观察的对象。当需要被观察的状态发生变化时,需要通知队列中所有观察者对象。Subject需要维持(添加,删除,通知)一个观察者对象的队列列表。
ConcreteSubject
被观察者的具体实现。包含一些基本的属性状态及其他操作。
Observer(观察者)
接口或抽象类。当Subject的状态发生变化时,Observer对象将通过一个callback函数得到通知。
ConcreteObserver
观察者的具体实现。得到通知后将完成一些具体的业务逻辑处理。
package gof23; import java.util.LinkedList; import java.util.List; public class ObserverTest { public static void main(String[] args) { Subject boss = new Boss(); StockObserver colleague1 = new StockObserver("张三", boss); NBAObserver colleague2 = new NBAObserver("李四", boss); boss.attach(colleague1); boss.attach(colleague2); boss.setAction("你们的老板我第一次回来了"); boss.notifyObserver(); System.out.println(); boss.detach(colleague2); boss.setAction("你们的老板我第二次回来了"); boss.notifyObserver(); } } /* * 通知者接口 */ interface Subject{ int i =10; //增加观察者 public void attach(Observer observer); //移除观察者 public void detach(Observer observer); //通知 public void notifyObserver(); //返回状态 public String getAction(); //设置状态 public void setAction(String action); } /* * 老板作为通知者 */ class Boss implements Subject { private List<Observer> observers = new LinkedList<>(); private String action; @Override public void attach(Observer observer) { observers.add(observer); } @Override public void detach(Observer observer) { observers.remove(observer); } @Override public void notifyObserver() { for(Observer observer : observers) { observer.update(); } } public String getAction() { return action; } public void setAction(String action) { this.action = action; } } /* * 秘书作为通知者 */ class Secretary implements Subject { private List<Observer> observers = new LinkedList<>(); private String action; @Override public void attach(Observer observer) { observers.add(observer); } @Override public void detach(Observer observer) { observers.remove(observer); } @Override public void notifyObserver() { for(Observer observer : observers) { observer.update(); } } public String getAction() { return action; } public void setAction(String action) { this.action = action; } } /* * 观察者抽象类 */ abstract class Observer { protected String name; protected Subject subject; public Observer(String name, Subject sub){ this.name = name; this.subject = sub; } public abstract void update(); } /* * 股票观察者 */ class StockObserver extends Observer { public StockObserver(String name, Subject sub) { super(name, sub); } @Override public void update() { System.out.println(name + "," + subject.getAction() + " 关闭股票行情,继续工作!"); } } /* * NBA观察者 */ class NBAObserver extends Observer { public NBAObserver(String name, Subject sub) { super(name, sub); } @Override public void update() { System.out.println(name + "," + subject.getAction() + " 关闭NBA直播,继续工作!"); } }
运行结果为:
张三,你们的老板我第一次回来了 关闭股票行情,继续工作! 李四,你们的老板我第一次回来了 关闭NBA直播,继续工作! 张三,你们的老板我第二次回来了 关闭股票行情,继续工作!
观察者模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。