📜  设计模式-观察者模式(1)

📅  最后修改于: 2023-12-03 15:41:45.202000             🧑  作者: Mango

设计模式-观察者模式

介绍

观察者模式是一种行为型设计模式。在该模式中,一个对象(称为主题)维护一组依赖于它的对象(称为观察者),当主题状态发生改变时,所有的观察者都得到通知并且自动更新。

观察者模式也被称为发布-订阅模式、模型-视图模式、源-监听器模式或者从属者模式。

实现

观察者模式包含以下角色:

  • Subject(主题): 主题接口,定义了注册、删除和通知观察者的方法。
  • ConcreteSubject(具体主题): 实现了主题接口,用来维护状态,并当状态发生改变时通知其观察者。
  • Observer(观察者): 观察者接口,定义了得到更新通知方法。
  • ConcreteObserver(具体观察者): 实现了观察者接口,以便在主题状态发生改变时更新自身状态。
// Subject.java
public interface Subject{
    public void registerObserver(Observer o);
    public void removeObserver(Observer o);
    public void notifyObservers();
}

// ConcreteSubject.java
public class ConcreteSubject implements Subject{
    private List<Observer> observers;
    private int state;
    
    public ConcreteSubject(){
        observers = new ArrayList<>();
    }
    
    public void registerObserver(Observer o){
        observers.add(o);
    }
    
    public void removeObserver(Observer o){
        int index = observers.indexOf(o);
        if(index >= 0){
            observers.remove(index);
        }
    }
    
    public void notifyObservers(){
        for(Observer observer : observers){
            observer.update(state);
        }
    }
    
    public void setState(int state){
        this.state = state;
        notifyObservers();
    }
}

// Observer.java
public interface Observer{
    public void update(int state);
}

// ConcreteObserver1.java
public class ConcreteObserver1 implements Observer{
    public void update(int state){
        // 根据具体业务逻辑更新自身状态
    }
}

// ConcreteObserver2.java
public class ConcreteObserver2 implements Observer{
    public void update(int state){
        // 根据具体业务逻辑更新自身状态
    }
}
使用

观察者模式可以应用于各种场景,例如事件处理、用户界面组件、消息传递等等。

public static void main(String[] args){
    ConcreteSubject subject = new ConcreteSubject();
    ConcreteObserver1 observer1 = new ConcreteObserver1();
    ConcreteObserver2 observer2 = new ConcreteObserver2();
    
    subject.registerObserver(observer1);
    subject.registerObserver(observer2);
    
    subject.setState(1);
    
    subject.removeObserver(observer2);
    
    subject.setState(2);
}
优点
  • 可以实现动态的发布-订阅关系,增强了灵活性和扩展性。
  • 松耦合的设计,主题和观察者可以独立地变化,相互之间不会产生太多影响。
  • 观察者模式符合开闭原则,新的观察者可以随时加入。
缺点
  • 一个观察者实例可能会受到过多的通知,导致性能下降。因此,需要谨慎设计实现。
总结

观察者模式是一种灵活且有效的设计模式,可以满足很多应用场景的需求。在使用观察者模式时,需要注意各个角色的职责和关系,以确保程序的健壮性和性能。