Design pattern ten, observer pattern

Observer mode

Principle: It is also called publish/subscribe mode, which defines a one-to-many dependency, allowing multiple observers to monitor a certain subject object at the same time. When the state of the subject object changes, notify all registered observers so that they can Update yourself automatically

Example
Subject: Abstract subject, which stores all object references to observers in a collection, and each subject can have any number of observers. Abstract themes provide interfaces (attach, detach, notify), which can be added and deleted to notify observer objects.

Observer: Abstract observer, defines an interface for all concrete observer classes, and updates itself when notified by the subject.

When the subject state changes, the notify method calls the update method of each Observer

The notify method should be multi-threaded

//抽象主题
public interface Subject {
    
    
    //观察者聚集
    ArrayList<Observer> observers = new ArrayList<>();

    //接口
    public void Attach(Observer observer);
    public void Detach(Observer observer);
    public void Notify();

}

//c抽象观察者
public interface Observer {
    
    
    //更新接口
    public void Update();
}

//具体主题
public class ConcereteSubject implements Subject {
    
    

    @Override
    public void Attach(Observer observer) {
    
    
        observers.add(observer);
    }

    @Override
    public void Detach(Observer observer) {
    
    
        observers.remove(observer);
    }

    //发布通知,应该用多线程
    @Override
    public synchronized void Notify() {
    
    
        for (Observer observer : observers) {
    
    
            observer.Update();
        }
    }
}

public class ConcreteObserver implements Observer {
    
    
    private String name;
    private ConcereteSubject concereteSubject;

    public ConcreteObserver(String name, ConcereteSubject concereteSubject) {
    
    
        this.name = name;
        this.concereteSubject = concereteSubject;
    }

    @Override
    public void Update() {
    
    
        System.out.println("观察者" + name + "收到了通知,已更新");
    }

    public static void main(String[] args) {
    
    
        ConcereteSubject Boss = new ConcereteSubject();

        Boss.Attach(new ConcreteObserver("A", Boss));
        Boss.Attach(new ConcreteObserver("B", Boss));

        //发布通知
        Boss.Notify();
    }
}

Output

观察者A收到了通知,已更新
观察者B收到了通知,已更新

Guess you like

Origin blog.csdn.net/weixin_45401129/article/details/114629397