📜  观察者模式java(1)

📅  最后修改于: 2023-12-03 14:57:21.943000             🧑  作者: Mango

观察者模式Java

观察者模式是一种经典的设计模式,也被称为发布-订阅模式。它允许对象之间保持松散的耦合关系,当一个对象状态发生变化时,所有依赖它的对象都会被通知并更新自己的状态。Java中的观察者模式通常使用Java.util包中的接口和类实现。

UML类图

下面是观察者模式的UML类图:

观察者模式UML类图

角色说明
  • 抽象主题(Subject):定义了被观察者必须实现的操作,它可以添加,删除和通知观察者对象。
    public interface Subject {
        void registerObserver(Observer observer);
        void removeObserver(Observer observer);
        void notifyObservers();
    }
    
  • 具体主题(ConcreteSubject):将有关状态存入具体观察者对象,当具体主题的状态发生变化时,向它的各个观察者发出通知。
    public class ConcreteSubject implements Subject {
        private List<Observer> observers = new ArrayList<>();
        private int state;
    
        public void setState(int state) {
            this.state = state;
            notifyObservers();
        }
    
        @Override
        public void registerObserver(Observer observer) {
            observers.add(observer);
        }
    
        @Override
        public void removeObserver(Observer observer) {
            observers.remove(observer);
        }
    
        @Override
        public void notifyObservers() {
            for (Observer observer : observers) {
                observer.update(state);
            }
        }
    }
    
  • 抽象观察者(Observer):定义了观察者必须实现的操作,主要是为了让具体观察者通过统一的接口对应到抽象主题。
    public interface Observer {
        void update(int state);
    }
    
  • 具体观察者(ConcreteObserver):实现抽象观察者所要求的更新接口,以便使自身的状态与主题的状态相符,具体观察者通过主题提供的接口注册自己以便接收主题的通知。
    public class ConcreteObserver implements Observer {
        private int state;
    
        @Override
        public void update(int state) {
            this.state = state;
            System.out.println("观察者状态更新:" + state);
        }
    }
    
使用示例

以下是一个简单的示例,用于演示观察者模式在Java中的使用:

public class Client {

    public static void main(String[] args) {
        Subject subject = new ConcreteSubject();

        Observer observer1 = new ConcreteObserver();
        Observer observer2 = new ConcreteObserver();

        subject.registerObserver(observer1);
        subject.registerObserver(observer2);

        ((ConcreteSubject) subject).setState(1);

        subject.removeObserver(observer2);

        ((ConcreteSubject) subject).setState(2);
    }
}

输出:

观察者状态更新:1
观察者状态更新:1
观察者状态更新:2
总结

观察者模式实现了对象间的解耦,通过抽象主题和抽象观察者,在一定程度上提高了系统的灵活性和可扩展性。在Java中,观察者模式的实现通常使用Java.util包中的接口和类,例如Observer和Observable类。因此,Java开发人员可以方便地使用观察者模式来实现可重用和灵活的代码。