zoukankan      html  css  js  c++  java
  • 移动架构-观察者模式

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

    角色

    抽象主题(Subject)角色:抽象主题角色把所有对观察者对象的引用保存在一个聚集(比如ArrayList对象)里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象,抽象主题角色又叫做抽象被观察者(Observable)角色
    具体主题(ConcreteSubject)角色:将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫做具体被观察者(Concrete Observable)角色
    抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到主题的通知时更新自己,这个接口叫做更新接口
    具体观察者(ConcreteObserver)角色:存储与主题的状态自恰的状态。具体观察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态 像协调。如果需要,具体观察者角色可以保持一个指向具体主题对象的引用

    使用场景:

    • 一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用
    • 一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度
    • 一个对象必须通知其他对象,而并不知道这些对象是谁
    • 需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制

    理解实例

    抽象主题

    public class AbstractSubject {
    	
    	private List<Observer> list = new ArrayList<>();
    	
    	public void attach(Observer observer) {
    		list.add(observer);
    	}
    	
    	public void detach(Observer observer) {
    		list.remove(observer);
    	}
    	
    	public void notify(String content) {
    		for (Observer observer : list) {
    			observer.update(content);
    		}
    	}
    }
    

    具体主题

    public class ConcreteSubject extends AbstractSubject{
    	
    }
    

    抽象观察者

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

    具体观察者

    public class ConcreteObserver implements Observer{
    
    	private String name;
    	
    	public ConcreteObserver(String name) {
    		this.name = name;
    	}
    
    	@Override
    	public void update(String content) {
    		System.out.println(name + " : " + content);
    	}
    }
    

    测试类

    public class Test {
    
    	public static void main(String[] args) {
    		//建立被观察者
    		AbstractSubject abstractSubject = new AbstractSubject();
    		//建立观察者
    		Observer observer1 = new ConcreteObserver("观察者 One");
    		Observer observer2 = new ConcreteObserver("观察者 Two");
    		Observer observer3 = new ConcreteObserver("观察者 Three");
    		//建立联系
    		abstractSubject.attach(observer1);
    		abstractSubject.attach(observer2);
    		abstractSubject.attach(observer3);
    		//通知观察者
    		abstractSubject.notify("开启通知");
    		//注销
    		abstractSubject.detach(observer1);
    		abstractSubject.detach(observer2);
    		abstractSubject.detach(observer3);
    	}
    }
    
  • 相关阅读:
    腾讯企业微信机器人通知
    python 协程、异步、async
    pytest获取测试用例执行结果(钩子函数:pytest_runtest_makereport)
    pytest hook使用
    sqlalchemy backref解释
    docker 启动mysql 并本地连接
    Flask用paginate实现数据分页
    在flask中使用flaskmigrate管理数据库
    ExtAspNet v2.3.5
    Caliburn Micro下轻松实现ListView的全选功能
  • 原文地址:https://www.cnblogs.com/cj5785/p/10664619.html
Copyright © 2011-2022 走看看