观察者模式
- 1、介绍观察者模式
- 2、具体实现
1、介绍观察者模式
观察者(Observer)该模式是指当观察者的状态发生变化时,系统根据事件驱动理论将其状态通知订阅模式的观察者,以完成状态修改和事件传播。该模式有时也被称为发布-订阅模式或模型-视图模式。
观察者模式是一种对象行为模式。观察者与被观察者之间的关系是抽象耦合。其主要优点是在观察者与被观察者之间建立了一套事件启动机制,以减少两者之间的耦合。
观察模式的主要作用如下:
- 抽象主题(Subject):持有订阅主题的观察对象的集合,并在主题状态发生变化后提供增加和删除观察对象的方法和通知方法。
- 具体主题(Concrete Subject):抽象主题的通知方法已经实现。当主题的内部状态发生变化时,调用该方法通知订阅主题状态的观察对象。
- 抽象观察者(Observer):观察者的抽象或界面定义了主题状态发生变化时需要调用的方法。
- 具体观察者(Concrete Observer):在收到主题状态发生变化的信息后,抽象观察者的实现类实施了具体的出发机制。
(1)定义Subject抽象主题:
////抽象目标类publicic abstract class Subject { protected List<Observer> observers=new ArrayList<>(); //增加观察者 public void add(Observer observer){ observers.add(observer); } //删除观察者 public void remove(Observer observer){ observers.remove(observer); } public abstract void notifyObserver(String message); //通知观察者抽象方法}
上述代码定义了抽象主题Subject,并定义和实现了方法add()、remove()
向Subject添加观察者和删除观察者,定义抽象方法notifyObserver()
在状态发生变化时,将变化后的消息发送给观察者。
(2)定义Concretesubjecte的具体主题:
//定义特定主题Concretesubjectpublict class ConcreteSubject extends Subject { @Override public void notifyObserver(String message) { for (Observer observer : observers) { System.out.println("notify observer "+message+" change..."); ((Observer)observer).dataChange(message); } }}
上述代码定义了ConcreteSubject类,它继承了Subject并实现了notifyObserver()
,用于向观察者发送信息。
(3)定义抽象观察者Observer
////抽象观察者public interface Observer { void dataChange(String message); //接收数据
上述代码定义了观察者Observer接口并定义了它dataChange()
,接收Concretesubject发送的通知。
(4)定义具体观察者Concreteobserver:
///定义具体观察者public class ConcreteObserver implements Observer{ @Override public void dataChange(String message) { System.out.println("receive message:"+message); }}
上述代码定义了具体的观察者concreteobserver类,用于接收observer发送的通知并进行具体的消息处理。
(5)使用观察者模式:
//使用观察者模式publicic static void main(String[] args) { Subject subject=new ConcreteSubject(); Observer observer=new ConcreteObserver(); subject.add(observer); subject.notifyObserver(data1);}
在使用观察者模式时,首先设置Subject主题,然后定义需要接收通知的观察者,然后将观察者添加到主题的监控列表中,当数据发生变化时,Subject(主题)将变更后的消息发送给观察者,最后调用subject方法notifyObserver()
具体操作结果如下: