设计模式 观察者模式
观察者模式是为了实现松耦合(loosely coupled)。
定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题的对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
在不使用观察者模式时,我们需要在被观察者本身发生改变时来调用观察者,在某些情况下,比如新增观察者时就需要同时修改被观察者来调用,而在使用观察者模式后,我们只需要在修改观察者的注册与否,实现松耦合。
主体接口:
package com.example.observer;
/**
* @author wp
* @date Created in 14:38 2020/5/5
*/
public interface Subject {
/**
* 注册一个观察着
*
* @param observer 观察者
*/
public void registerObserver(Observer observer);
/**
* 移除一个观察者
*
* @param observer 观察者
*/
public void removeObserver(Observer observer);
/**
* 通知所有的观察着
*/
public void notifyObservers();
}
主体具体实现:
package com.example.observer;
import java.util.ArrayList;
import java.util.List;
/**
* @author wp
* @date Created in 14:43 2020/5/5
*/
public class ConcreteSubject implements Subject{
private List<Observer> observers = new ArrayList<>();
/**
* 状态
*/
private String status = "停用";
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
observers.forEach(observer -> observer.update(status));
}
public void setStatus(String status){
this.status = status;
notifyObservers();
}
}
观察者接口:
package com.example.observer;
/**
* @author wp
* @date Created in 14:39 2020/5/5
*/
public interface Observer {
/**
* 更新自身状态
* @param status 状态
*/
public void update(String status);
}
观察者具体实现:
package com.example.observer;
/**
* @author wp
* @date Created in 14:47 2020/5/5
*/
public class ConcreteObserver implements Observer {
private String status = "停用";
public ConcreteObserver(Subject subject){
subject.registerObserver(this);
}
@Override
public void update(String status) {
this.status = status;
System.out.println("更新后状态为:"+this.status);
}
}
测试代码:
package com.example.observer;
/**
* @author wp
* @date Created in 14:49 2020/5/5
*/
public class Test {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
ConcreteObserver observer1 = new ConcreteObserver(subject);
ConcreteObserver observer2 = new ConcreteObserver(subject);
subject.setStatus("正常");
}
}
使用观察者模式的目的就是降低系统的耦合程度,合理的使用可以在一定程度上使得代码更加灵活易拓展。