02-设计模式-观察者模式

发布时间 2023-07-15 10:34:17作者: 47677777

观察者模式涉及的对象:

  • 观察者接口、观察者接口的实现类
  • 被观察者接口、被观察者接口的实现类

1、观察者接口-代码:

public interface Observer {
    void update(String msg);
}

2、观察者接口的实现类-代码:

public class ObserverImpl implements  Observer{
    private String name;
    
    public ObserverImpl(String name){
        this,name = name;
    }
    
    @Override
    void update(String msg){
        System.out.println(this.name+" 观察到了数据变化,接收到数据:"+msg);
    }
    
    public String getName() {
        return name;
    }
}

3、被观察者接口-代码:

public interface Subject {
    
    // 绑定观察者
    void attcah(ObserverImpl observer);
    
    // 解绑观察者
    void detcah(ObserverImpl observer);
    
    // 将数据msg发给所有的观察者
    void toNotifyAllObserver(String msg);
}

4、被观察者接口的实现类-代码:

public class SubjectImpl implements Subject {
    
    private List<Observer> observerList = new ArrayList<>();
    
    // 绑定观察者
    void attcah(ObserverImpl observer){
        System.out.println("正在绑定到观察者:"+observer.getName());
        observerList.add(observer);
    }
    
    // 解绑观察者
    void detcah(ObserverImpl observer){
        System.out.println("正在解绑观察者:"+observer.getName());
        observerList.remove(observer);
    }
    
    // 将数据msg发给所有的观察者
    void toNotifyAllObserver(String msg){
        for (Observer observer : observerList) {
            observer.update(msg);
        }
    }
    
}

5、使用:

public class Main {
    public static void main(String[] args) {
        
        ObserverImpl observer1 = new ObserverImpl("观察者1");
        ObserverImpl observer2 = new ObserverImpl("观察者2");
        
        SubjectImpl subject = new SubjectImpl();
        
        subject.attach(observer1);
        subject.attach(observer2);
        
        subject.toNotifyAllObserver("你好!");
        
        subject.detach(observer1);
        subject.detach(observer2);        
        
        
    }
}

/*
打印结果:

    正在绑定到观察者:观察者1
    正在绑定到观察者:观察者2
    观察者1 观察到了数据变化,接收到数据:你好!
    观察者2 观察到了数据变化,接收到数据:你好!
    正在解绑观察者:观察者1
    正在解绑观察者:观察者2
*/