美文网首页Android技术知识Android开发Android开发
Android常见设计模式—观察者模式

Android常见设计模式—观察者模式

作者: 大漠孤烟直_v | 来源:发表于2020-03-12 16:53 被阅读0次

    Observer(观察者模式)

    有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

    将一个系统分割成一个一些类相互协作的类有一个不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。观察者就是解决这类的耦合关系的(依赖关系并未完全解除,抽象通知者依旧依赖抽象的观察者。)。

    观察者模式的组成

    ①抽象主题(Subject)
    它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。

    ②具体主题(ConcreteSubject)
    将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。

    ③抽象观察者(Observer)
    为所有的具体观察者定义一个接口,在得到主题通知时更新自己。

    ④具体观察者(ConcreteObserver)
    实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。

    言语苍白,上代码:

    /**
     * 抽象观察者
     */
    public interface Observer {
        void update(String str);
    }
    
    /**
     * 具体观察者
     */
    public class ConcreteObserver implements Observer {
        @Override
        public void update(String str) {
            System.out.println(str);
        }
    }
    
    /**
     * 抽象主题
     */
    public interface Subject {
        void addObserver(Observer observer);
    
        void removeObserver(Observer observer);
    
        void notifyObserver(String str);
    }
    
    /**
     * 具体主题
     */
    public class ConcreteSubject implements Subject {
    
        List<Observer> mObserverList = new ArrayList<>();
    
        @Override
        public void addObserver(Observer observer) {
            mObserverList.add(observer);
        }
    
        @Override
        public void removeObserver(Observer observer) {
            mObserverList.remove(observer);
        }
    
        @Override
        public void notifyObserver(String str) {
            for (Observer observer : mObserverList) {
                observer.update(str);
            }
        }
    }
    
    /**
     * 测试类
     */
    public static void main(String[] args) {
        //一个主题
        ConcreteSubject eatSubject = new ConcreteSubject();
        //两个观察者
        ConcreteObserver personOne = new ConcreteObserver();
        ConcreteObserver personTwo = new ConcreteObserver();
        //观察者订阅主题
        eatSubject.addObserver(personOne);
        eatSubject.addObserver(personTwo);
        //主题通知观察者更新状态
        eatSubject.notifyObserver("开饭了");
    }
    

    相关文章

      网友评论

        本文标题:Android常见设计模式—观察者模式

        本文链接:https://www.haomeiwen.com/subject/gljmjhtx.html