当前位置: 代码迷 >> 综合 >> 设计模式之观察者模式(发布/订阅模式:publish/subscribe)
  详细解决方案

设计模式之观察者模式(发布/订阅模式:publish/subscribe)

热度:73   发布时间:2023-12-03 13:34:46.0

定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己

观察者模式的关键对象是主题Subject和观察者Observer.一个Subject可以有任意数目依赖它的Observer,

一旦Subject的状态发生了改变,所有的Observer都可以得到通知.Subject发出通知的时候并不需要知道谁是它的Observer.

而且任何具体的观察者也不知道其他观察者是什么

观察者模式的使用场景

当一个对象的改变需要同时改变其他对象,并且不需要知道具体多少需要改变

Subject类,可翻译为主题或抽象通知者,一般用一个抽象类或者一个接口实现.它把所有对观察者对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者.
抽象主题提供一个接口,可以增加和删除观察者对象.

Observer类,抽象观察者,为所有的具体观察者定义一个接口,在得到主题的通知时更新自己.这个接口叫做更新接口.抽象观察者一般用一个抽象类或者一个接口实现.
更新接口通常包含一个Update()方法,这个方法叫做更新方法.

ConcreteSubject类,叫做具体主题或具体通知者,将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知.
具体主题角色通常用一个具体子类实现

    public static void main(String[] args) {
        SubscriptionSubject mSubscriptionSubject=new SubscriptionSubject();
        //创建微信用户
        WeixinUser user1=new WeixinUser("a");
        WeixinUser user2=new WeixinUser("b");
        WeixinUser user3=new WeixinUser("c");
        //订阅公众号
        mSubscriptionSubject.add(user1);
        mSubscriptionSubject.add(user2);
        mSubscriptionSubject.add(user3);
        mSubscriptionSubject.notify("d的专栏更新了");
    }

 

/**
 * 微信用户是观察者,微信公众号是被观察者,有多个的微信用户关注了一个公众号
 * 当这个公众号更新时就会通知这些订阅的微信用户
 *抽象观察类
 * @author guk
 *
 */
public interface Observer {
    public void update(String message);
}

/**
 * 具体观察者 ConcreteObserver
 * @author guk
 *
 */
public class WeixinUser implements Observer {
    //微信用户名
    private String name;
    
    public WeixinUser(String name) {
        super();
        this.name = name;
    }

    @Override
    public void update(String message) {
        System.out.println(name+"-"+message);
    }
}

/**
 * 抽象被观察者类Subject
 * @author guk
 *
 */
public interface Subject {
    
    /**
     * 增加订阅者
     * @param observer
     */
    void add(Observer observer);
    /**
     * 删除订阅者
     * @param observer
     */
    void delete(Observer observer);
    /**
     * 通知订阅者更新消息
     * @param message
     */
    void notify(String message);
}
 

/**
 * 具体被观察者(ConcreteSubject)
 * @author guk
 *
 */
public class SubscriptionSubject implements Subject {
    //储存订阅公众号的微信用户
    private List<Observer> weixinUserList=new ArrayList<Observer>();
    
    @Override
    public void add(Observer observer) {
        weixinUserList.add(observer);
    }

    @Override
    public void delete(Observer observer) {
        weixinUserList.remove(observer);
    }

    @Override
    public void notify(String message) {
        for(Observer observer:weixinUserList) {
            observer.update(message);
        }
    }

}
 

  相关解决方案