行为型模式:观察者模式

收藏:

对象间的联动——观察者模式

 

观察者模式定义如下

观察者模式(Observer Pattern):

定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。

观察者模式的别名包括发布-订阅(Publish/Subscribe)模式、模型-图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。

观察者模式是一种对象行为型模式。

 

 观察者模式结构图中包含如下几个角色:

Subject(目标)

目标又称为主题,它是指被观察的对象。

在目标中定义了一个观察者集合,一个观察目标可以接受任意数量的观察者来观察,它提供一系列方法来增加和删除观察者对象,同时它定义了通知方法notify()。

目标类可以是接口,也可以是抽象类或具体类。

ConcreteSubject(具体目标)

具体目标是目标类的子类,通常它包含有经常发生改变的数据,当它的状态发生改变时,向它的各个观察者发出通知;

同时它还实现了在目标类中定义的抽象业务逻辑方法(如果有的话)。如果无须扩展目标类,则具体目标类可以省略。

Observer(观察者)

观察者将对观察目标的改变做出反应,观察者一般定义为接口,该接口声明了更新数据的方法update(),因此又称为抽象观察者。

ConcreteObserver(具体观察者)

在具体观察者中维护一个指向具体目标对象的引用,它存储具体观察者的有关状态,这些状态需要和具体目标的状态保持一致;

它实现了在抽象观察者Observer中定义的update()方法。

通常在实现时,可以调用具体目标类的attach()方法将自己添加到目标类的集合中或通过detach()方法将自己从目标类的集合中删除。

观察者模式描述了如何建立对象与对象之间的依赖关系,以及如何构造满足这种需求的系统。

观察者模式包含观察目标和观察者两类对象,一个目标可以有任意数目的与之相依赖的观察者,一旦观察目标的状态发生改变,所有的观察者都将得到通知。

作为对这个通知的响应,每个观察者都将监视观察目标的状态以使其状态与目标状态同步,这种交互也称为发布-订阅(Publish-Subscribe)。

观察目标是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅它并接收通知。

 

代码示例

观察者模式即为发布订阅模式

//抽象观察者
//定义了一个update()方法,当被观察者调用notifyObservers()方法时,观察者的update()方法会被回调。
public interface Observer {
    public void update(String message);
}

//抽象被观察者接口
public interface Observerable {    
    public void registerObserver(Observer observer);//注册订阅者    
    public void removeObserver(Observer observer);//移除订阅者
    public void notifyObserver();//通知订阅者
}

// 被观察者,也就是微信公众号服务
// 实现了Observerable接口,对Observerable接口的三个方法进行了具体实现
public class WechartServer implements Observerable{
    private List<Observer> observers;
    private String message;    
    public WechartServer() {
        observers=new ArrayList<>();
        message="这是微信的一个消息";
    }
    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }
    @Override
    public void removeObserver(Observer observer) {
        if(!observers.isEmpty()){
            observers.remove(observer);
        }
    }
    @Override
    public void notifyObserver() {
        for (Observer observerTemp : observers) {
            observerTemp.update(message);
        }
    }    
}

//观察者  具体的去实现update方法
public class UserA implements Observer{
    String name;
    String message;    
    public UserA( String name) {
        this.name=name;
    }
    @Override
    public void update(String message) {
        this.message=message;
        read();
    }
    public void read(){
        System.out.println(name+ "get message: "+message);
    }
}

public class Test {
    public static void main(String[] args) {    
        UserA zhangsan=new UserA("zhangsan");
        Observerable observerable=new WechartServer();
        observerable.registerObserver(zhangsan);
        observerable.notifyObserver();    
    }
}

 

参考:https://www.cnblogs.com/luohanguo/p/7825656.html

          https://www.cnblogs.com/fingerboy/p/5468994.html

posted @ 2019-02-01 14:20  弱水三千12138  阅读(185)  评论(0)    收藏  举报