观察者模式(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直播,继续工作! 张三,你们的老板我第二次回来了 关闭股票行情,继续工作!
原文地址:http://blog.csdn.net/hjiam2/article/details/38147635