观察者
1. 观察者模式(发布-订阅Publish/Subscribe):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,让它们能够自动更新自己。
2. 将一个系统分割成一系列互相协作的类,有一个缺点:需要维护相关对象间的一致性。紧密的耦合会给维护和扩展带来不便。观察者模式就是为了解耦而诞生的,让原本一个对象依赖另一个对象的关系,变成了两方都依赖于抽象,而不再依赖于具体,从而使得各自的变化都不会影响另一边的变化。
3. 初级的观察者模式,由于“通知者”依赖“观察者”,不够好。所以升级的方法叫“委托”。
4. 委托是一种引用方法的类型,一旦为委托分配了方法,委托将与该方法具有完全相同的行为,委托方法的使用可以像其他任何方法一样,具有参数和返回值。委托可以看做是对函数的抽象,是函数的“类”,委托的实例将代表一个具体的函数。一个委托可以搭载多个方法,所有方法被依次唤醒,最重要的是,委托对象所搭载的方法并不需要属于同一个类。委托对象所搭载的所有方法必须具有相同的圆形和形式,也就是拥有相同的参数列表和返回值类型.
/**
* 《大话设计模式》14章————老板回来,我不知道【观察者模式】
*/
import java.util.ArrayList;
import java.util.Iterator;
/**
* @author LilyLee
* @date 2017年6月1日
* @time 上午8:08:09
* @Version 1.0
* @email lilylee_1213@foxmail.com
*
*/
public class ObserverTest {
public static void main(String[] args) {
ConcreteSubject cs=new ConcreteSubject();
//增加观察者
cs.Attach(new ConcreteObserver(cs,"Lily"));
cs.Attach(new ConcreteObserver(cs,"Dianer"));
cs.Attach(new ConcreteObserver(cs,"老张"));
cs.setSujstate("老板来了!赶紧跑!");
cs.Notify();
}
}
//Subject是抽象通知者,把所有对观察者对象的引用保存在一个聚集里。
//抽象提供接口,可以增加和删除观察者对象
abstract class Subject{
private ArrayList<Observer> obs=new ArrayList<Observer>();
//增加观察者
public void Attach(Observer ods){
obs.add(ods);
}
//移除观察者
public void Detach(Observer ods){
obs.remove(ods);
}
//通知观察者
public void Notify(){
for(int i=0;i<obs.size();i++){
obs.get(i).Update();
}
}
}
//Observer类,抽象观察者类,定义一个通知更新的接口,得到通知后更新自己。
abstract class Observer{
public abstract void Update();
}
//ConcreteSubject,具体通知者
class ConcreteSubject extends Subject{
private String sujstate;
public String getSujstate() {
return sujstate;
}
public void setSujstate(String sujstate) {
this.sujstate = sujstate;
}
}
//ConcreteObserver类,具体观察者,实现抽象观察者角色要求的更新。
class ConcreteObserver extends Observer{
private String name;
private String obsstate;
private ConcreteSubject subject;
public ConcreteSubject getSubject() {
return subject;
}
public void setSubject(ConcreteSubject subject) {
this.subject = subject;
}
public ConcreteObserver(ConcreteSubject subject,String name){
this.subject=subject;
this.name=name;
}
@Override
public void Update() {
obsstate=subject.getSujstate();
System.out.println("观察者 "+name+" 的新状态是 "+obsstate);
}
}