设计模式之观察者模式

定义:

  在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。

  其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。

模式对象:

  • 抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
  • 抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
  • 具体被观察者角色:也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。
  • 具体观察者角色:实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态相协调。
/**
 * @author yuyang
 * @DATE 2019/1/7 0007-10:14
 * 抽象观察者接口
 */
public interface Observer {
    //接收信息
    void receiveInformation (String msg);
}
/**
 * @author yuyang
 * @DATE 2019/1/7 0007-10:13
 * 抽象被观察者接口
 */
public interface Observerable {
    //新增关注
    void register(Observer observer);
    //取消关注
    void remove(Observer observer);
    //订阅消息通知
    void notifyMsm();
}
/**
 * @author yuyang
 * @DATE 2019/1/7 0007-10:23
 * 具体观察者
 */
public class User implements Observer{
   String name;
   String msg;

    public User(String name) {
        this.name = name;
    }

    @Override
    public void receiveInformation(String msg) {
        this.msg=msg;
        read();
    }
    public  void read(){
        System.out.println(name+"接收到的推送:"+msg);
    }
}
/**
 * @author yuyang
* 具体被观察者 * @DATE 2019/1/7 0007-10:16
*/ public class WechatServer implements Observerable { List<Observer> list; String msg; public WechatServer() { list = new ArrayList<>(); } @Override public void register(Observer observer) { list.add(observer); } @Override public void remove(Observer observer) { if (list != null) { list.remove(observer); } } @Override public void notifyMsm() { for (Observer ls: list) { ls.receiveInformation(msg); } } //编辑推送消息 public void setinformation(String s){ this.msg = s; System.out.println("微信服务更新消息: " + s); //消息更新,通知所有观察者 notifyMsm(); } }
/**
 * @author yuyang
 * @DATE 2019/1/7 0007-10:28
 */
public class Test {
    public static void main(String[] args) {
        WechatServer observerable=new WechatServer();
        User user=new User("与昂");
        User user2=new User("yuang");
        User user3=new User("于洋");
        observerable.register(user);
        observerable.register(user2);
        observerable.register(user3);
        observerable.setinformation("PHP是世界上最好的语言");
        System.out.println("___________________________________________");
        observerable.remove(user3);
        observerable.setinformation("那你把Java放在那里?");
    }
}

原文地址:https://www.cnblogs.com/yuyangcoder/p/10231870.html