设计模式之观察者模式

来源:互联网 发布:乐乎城市青年社区租房 编辑:程序博客网 时间:2024/06/04 20:10

参考《大话设计模式》
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够更新自己。
有以下两个关系:
通知者->“前台”通知者,来通知观察者
观察者-> 具体实现类,可以是员工<->老板关系中的员工,可以是学生<->老师关系中的学生,而老师或者通知学生的班干部就是通知者。
观察者模式结构图
这里写图片描述

*Subject,抽象通知者,一般用一个抽象类或者接口实现。*

public interface Subject {    void Attach(Observer observer);    void Detach(Observer observer);    void Notify();    String getSubjectState();    void setSubjectState();}

*Subject具体通知者类,比如老板或通知其他观察者的员工通知类。*

public class ConcreteSubject implements Subject{    private ArrayList<Observer> observers = new ArrayList<Observer>();    private String action;    //Add Observer    @Override    public void Attach(Observer observer)    {        observers.add(observer);    }    //remove observer    @Override    public  void Detach(Observer observer)    {        observers.remove(observer);    }    //Notify    @Override    public void Notify()    {        for (Observer o : observers)        {            o.Update();        }    }    //状态,通知类的状态,比如书中实例2的老板或前台。    @Override    public String getSubjectState()    {        return action;    }    @Override    public void setSubjectState(String action) {        this.action = action;    }}

*Observer抽象类或接口*

public interface Observer {    void Update();}

Observer具体实现类1

public class ConcreteObserver1 implements Observer {    private String name;    private Subject subject;    public ConcreteObserver1(String name, Subject subject)    {        this.name = name;        this.subject = subject;    }    @Override    public void Update() {        System.out.println(subject.getSubjectState()+" is comeback "+name+" should do something rightly");    }}

Observer具体实现类2

public class ConcreteObserver2 implements Observer {    private String name;    private Subject subject;    public ConcreteObserver2(String name, Subject subject)    {        this.name = name;        this.subject = subject;    }    @Override    public void Update() {        System.out.println(subject.getSubjectState()+" is comeback "+name+" should do something rightly");    }}

客户端代码

public class Client {    public static void main(String[] args) {        ConcreteSubject concreteSubject = new ConcreteSubject();        ConcreteObserver1 concreteObserver1 = new ConcreteObserver1("张三", concreteSubject);        ConcreteObserver2 concreteObserver2 = new ConcreteObserver2("李四", concreteSubject);        concreteSubject.Attach(concreteObserver1);        concreteSubject.Attach(concreteObserver2);        concreteSubject.Detach(concreteObserver2);//如果concrete没有被concreteSubject通知到        //concreteSuject回来了,        concreteSubject.setSubjectState("老板回来...");        //应该要发出通告了        concreteSubject.Notify();    }}

最后输出

老板回来... is comeback 张三 should do something rightly

原书中观察者模式代码解释部分,它具体的实现类ConcreteObserver还是和具体类ConcreteSubject耦合在一起了,没有依赖于抽象。看的我有点懵逼,不知道是不是我弄错了,总之观察者模式看了好久才看懂了这个套路。以上我根据前面的实例修改了观察者模式的代码,如有错误之处,望指出。后续,解释Java委托事件的和C#的不同和Java委托事件的实现。
有关Java委托事件的实现:
http://blog.csdn.net/shuciqi/article/details/25706325
和反射机制:
百度百科:
http://baike.baidu.com/link?url=Y_KjRKQ9YRgTS58PW02ePkfCXoIpdMXSC-yFsb_lbXYllXHREznKWLRMa_QlJ_OLaIJ3ZrU-XkkDQgftmif5DZDlkbcRPEgVCQ76PedItWk9ueVotThWg66uignZOZ8TwS1LqzTupwA5OEOnCe75w_
参考blog:
http://www.cnblogs.com/lzq198754/p/5780331.html

0 0