设计模式之观察者模式

来源:互联网 发布:js分页思路 编辑:程序博客网 时间:2024/06/14 20:51

使用场景:

1、对一个对象的改动需要同时改动其他对象,但又不知道具体有多少对象
2、当一个抽象模型有两个部分,其中一个部分依赖于另外一个部分,将两个部分封装到独立的对象中以实现独立的复用
3、当一个对象必须通知其他对象,但又不知道其他对象时谁

涉及到的有:

抽象观察者:定义为一个接口,其中可以有任意数量的观察者。可以添加、删除抽象观察者
抽象被观察者:定义为一个接口
具体观察者:实现抽象观察者接口,得到消息时通知自己。
具体被观察者:实现抽象被观察者接口。

抽象被观察者:

public interface Watched {    void addWatcher(Wather wather);    void remove(Wather wather);    void notifyWatchers();}

具体被观察者:

eg:微信公众号为一个被观察者,在微信公众号中有新消息时,通知所有关注公众号的微信用户

public class WeChat implements Watched{    List<Wather>  wathers = new ArrayList<Wather>();    public void addWatcher(Wather wather) {        wathers.add(wather);    }    public void remove(Wather wather) {        wathers.remove(wather);    }    public void notifyWatchers() {        for(Wather w :wathers){            w.update();        }    }}

抽象观察者:

public interface Wather {    void update();}

具体观察者:

eg:微信用户,得到消息时候更新自己

public class WeChatUser implements Wather {    private String name;    public WeChatUser(String name){        this.name=name;    }    public void update() {        System.out.println(name+" 收到更新消息!");    }}

测试类:

public class Test {    public static void main(String[] args){        WeChatUser user1 = new WeChatUser("遇见");        WeChatUser user2 = new WeChatUser("sg");        WeChat weChat = new WeChat();        weChat.addWatcher(user1);        weChat.addWatcher(user2);        weChat.notifyWatchers();    }}

运行结果

这里写图片描述