一、定义
观察者模式的好处是:它解除了观察者和目标之间的耦合关系。目标不需要知道他的额观察者的任何信息。相反目标只是允许观察者订阅事件。当目标产生一个事件时,它简单的将事件传给每一个观察者。
简单的说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者检查一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新。
二、优点:
1、观察者模式在被观察者和观察者之间建立一个抽象的耦合,被观察者角色所知道的只是一个具体观察者的列表,每一个具体观察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口
2、观察者模式支持广播通讯,被观察者会向所有的登记过的观察者发出通知。
三、缺点
1、如果一个被观察者对象有很多的之间和间接观察者的话,将所有的观察者都通知到会花费很长时间。
2、如果在被观察者之间有循环依赖的话(就是被观察者也是一个观察者),被观察者会触发他们之间进行循环调用,导致系统崩溃。
3、如果对观察者的通知时通过另外线程进行异步投递的话,系统必须保证投递是以自恰的方式进行的。
4、虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有响应的机制使观察者知道所观察的对象是怎么发生变化的,仅仅知道发生了变化。
四、具体实现
package Observer; import java.util.ArrayList; import java.util.List; /** * Created by Administrator on 2018/3/3 0003. */ public abstract class ISubject { List<Observer> list=new ArrayList(); public void attach(Observer ob){ list.add(ob); }; public void dettach(Observer ob){ list.remove(ob); }; public void Notify(){ for(Observer ob:list){ ob.update(); } } }
package Observer; /** * Created by Administrator on 2018/3/3 0003. */ public class conSubject extends ISubject { private String subjectstate; public void setSubjectstate(String subjectstate) { this.subjectstate = subjectstate; } public String getSubjectstate(){ return this.subjectstate; } }
package Observer; /** * Created by Administrator on 2018/3/3 0003. */ public abstract class Observer { public abstract void update(); }
package Observer; /** * Created by Administrator on 2018/3/3 0003. */ public class conObserver extends Observer { private String name; private conSubject subject; public conObserver(String name,conSubject subject){ this.name=name; this.subject=subject; } @Override public void update() { System.out.println(this.name+"收到消息:"+subject.getSubjectstate()); } }
public class Test { public static void main(String[] args) { conSubject subject=new conSubject(); Observer a=new conObserver("Tom",subject); Observer b=new conObserver("Jhon",subject); Observer c=new conObserver("Jack",subject); subject.attach(a); subject.attach(b); subject.attach(c); subject.setSubjectstate("mm来了"); subject.Notify(); subject.dettach(a); subject.dettach(b); subject.dettach(c); } }