观察者模式:定义对象间的一对多的依赖关系,当一个对象的状态发生改变时,所以依赖于他的对象都得到通知并更新。
角色分析:
抽象目标角色(Subject):
目标角色提供观察者注册、删除接口,并发出通知。
抽象观察者角色(IObserver):
当目标角色发生改变时,获得通知的对象的一个更新接口。
实现:
扫描二维码关注公众号,回复:
558553 查看本文章
package observer; /** *create by datao.wang 2014-2-8-下午2:45:04 *目标对象 */ public interface ISubject { public abstract void notifyObserver(); } package observer; import java.util.ArrayList; import java.util.List; /** *create by datao.wang 2014-2-8-下午2:50:48 */ public class Subject implements ISubject { List<IObserver> list=new ArrayList<IObserver>(); @Override public void notifyObserver() { for(IObserver ob:list){ ob.update(); } } public void addObserver(IObserver o){ list.add(o); } public void dosomething(){ System.out.println("我要跟新了"); //通知更新 notifyObserver(); } } package observer; /** *create by datao.wang 2014-2-8-下午2:41:04 *抽象观察者 */ public interface IObserver { public void update(); } package observer; /** *create by datao.wang 2014-2-8-下午2:42:33 *观察者1号 */ public class Observer1 implements IObserver { @Override public void update() { System.out.println("发生改变...."); } } package observer; /** *create by datao.wang 2014-2-8-下午2:42:59 *观察者2号 */ public class Observer2 implements IObserver { @Override public void update() { System.out.println("发生改变....."); } } package observer; /** *create by datao.wang 2014-2-8-下午2:58:00 *客户端调用 */ public class Client { public static void main(String[] args) { Subject subject=new Subject(); Observer1 s1=new Observer1(); Observer2 s2=new Observer2(); subject.addObserver(s1); subject.addObserver(s2); subject.dosomething(); } }
应用场景:
1、当一个对象的改变必须通知其他对象的时候,可采用观察者模式。
优点:
1、实现目标对象鱼观察对象的松耦合
2、实现广播通知注册的对象
缺点:
1、如果观察者众多,话费时间较多。
2、如果误操作目标对象,可能引起一连串的状态变更。
3、异步通知,注意多线程操作。