设计模式之观察者模式

来源:互联网 发布:人生 不 快乐 知乎 编辑:程序博客网 时间:2024/06/04 23:35

时隔多日,终于想动手写了,内心一片狼藉、愧疚。废话就不多说了,直接上正题吧。


观察者模式

观察者模式(Observer)完美的将观察者(Observer)和被观察的对象(Observerable)分离开。有个例子很恰当,报社与订报人,只要订报人预定了报纸,一有新报纸,报社就会送达给订阅人。观察者模式思想也是如此,下面具体来说:
最基本的观察者模式包括两个接口(IObserverable和IObserver)及其对应的实现类(ObserverableImp和ObserverImp),IObserverable中定义了void registObserver(IObserver o);,void removeObserver(IObserver o);,void notifyObservers();这三个方法;IObserver中定义了了void update();这个方法,实现类只需实现相应的接口的方法即可。

下面开始翠花的爱情故事:

翠花是我们的被追求者(被观察者),张三、李四、王麻子是翠花的追求者(观察者),翠花知道他们三个暗恋者自己,所以一有什么事情,就通知他们三个,三个人的表现不尽相同,因此,翠花评判张三不够喜欢自己,于是就把张三移除了自己的追求者集合当中,当翠花再次考验他们的时候,当然就不会再通知张三了。

这样就实现了一个简单的观察者模式。具体代码如下:


IObserverable 接口:

 public interface IObserverable {    void registObserver(IObserver o);    void removeObserver(IObserver o);    void notifyObservers();}

IObserver 接口:

public interface IObserver {    void update();}

IObserverable的实现类(被观察者):

public class ObserverableImp implements IObserverable{    //男朋友集合    private Set<IObserver> set;    public ObserverableImp() {        set = new HashSet<>();    }    /**     * 注册观察者     * 相当于翠花说,我知道了,o喜欢我     */    @Override    public void registObserver(IObserver o) {        set.add(o);    }    /**     * 取消观察者     * 相当于翠花对o死心了     */    @Override    public void removeObserver(IObserver o) {        set.remove(o);    }    /**     * 通知观察者     * 相当于翠花考验一波追求自己的人了     */    @Override    public void notifyObservers() {        for(IObserver o:set){            o.update();        }    }}

IObserver 的实现类(观察者):

public class ObserverImp implements IObserver {    private String message;    public ObserverImp(String message) {        this.message = message;    }    @Override    public void update() {        System.out.println(message);    }    public void setMessage(String message) {        this.message = message;    }}

测试类:

public class Test {    public static void main(String[] args) {        //翠花        ObserverableImp flower = new ObserverableImp();        //张三、李四、王麻子        ObserverImp zhangsan = new ObserverImp("我是张三,我好像有点喜欢翠花");        ObserverImp lisi = new ObserverImp("我是李四,我只喜欢翠花");        ObserverImp wangmazi = new ObserverImp("我是王麻子,翠花是我最心爱的人");        //张三、李四、王麻子分别向翠花说:我喜欢你        flower.registObserver(zhangsan);        flower.registObserver(lisi);        flower.registObserver(wangmazi);        //翠花开始考验追求者了        flower.notifyObservers();        //翠花觉得李四说的话显得不够爱自己,干脆放弃张三了        flower.removeObserver(zhangsan);        System.out.println("-------可爱的分割线---------");        //翠花再次考验追求者        flower.notifyObservers();    }}

输出结果:

我是王麻子,翠花是我最心爱的人我是张三,我好像有点喜欢翠花我是李四,我只喜欢翠花-------可爱的分割线---------我是王麻子,翠花是我最心爱的人我是李四,我只喜欢翠花
原创粉丝点击