GOF设计模式
Observer Pattern
观察者设计模式
观察者模式比喻
• 想知道咱们公司最新MM情报吗?加入公司的MM情报邮件组就行了,tom负责搜集情报,他发现的新情报不用一个一个通知我们,直接发布给邮件组,我们作为订阅者(观察
者)就可以及时收到情报啦。
• 观察者模式:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新。
• 抽象主题( Subject ) 角色:
• 主题角色把所有的观察者对象的引用保存在一个列表里;每个主题都可以有任何数量的观察者。主题提供一个接口可以加上或撤销观察者对象;主题角色又叫做抽象被观察者(Observable)角色;
import java.util.ArrayList;
import java.util.List;
import java.util.jar.Pack200;
/**
* Created by Administrator on 2017/2/14.
*/
public class Subject {
List<Observer> list=new ArrayList<>();
public void attach(Observer o){
list.add(o);
}
public void detach(Observer o){
list.remove(o);
}
public void Notify(){
for(Observer o:list){
o.update();
}
}
}
• 抽象观察者( Observer ) 角色:
• 为所有的具体观察者定义一个接口,在得到通知时更新自己;抽象观察者角色。
public abstract class Observer {
abstract void update();
}
• 具体主题( ConcreteSubject ) 角色:
• 保存对具体观察者对象有用的内部状态;在这种内部状态改变时给其观察者发出一个通知;具体主题角色又叫作具体被观察者角色;
public class ConcreteSubject extends Subject {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
• 具体观察者( ConcreteObserver ) 角色:
• 保存一个指向具体主题对象的引用;和一个与主题的状态相符的状态。具体观察者角色实现抽象观察者角色所要求的更新自己的接口,以便使本身的状态与主题的状态自恰。
public class ConcreteObserver extends Observer {
ConcreteSubject concreteSubject;
String name;
ConcreteObserver(ConcreteSubject concreteSubject,String name){
this.concreteSubject=concreteSubject;
this.name=name;
}
@Override
void update() {
System.out.println(name+"知道了"+concreteSubject.getMessage());
}
}
测试:
public class Test {
public static void main(String[] args) {
ConcreteSubject s=new ConcreteSubject();
s.attach(new ConcreteObserver(s,"MIKE"));
s.attach(new ConcreteObserver(s,"NIKE"));
s.attach(new ConcreteObserver(s,"TOM"));
s.setMessage("mengmeng来了");
s.Notify();
}
}