• 观察者模式


    观察者模式(Observer):定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,全部依赖于它的对象都得到通知并自己主动刷新。

    Observer模式的典型应用
    - 侦听事件驱动程序设计中的外部事件
    - 侦听/监视某个对象的状态变化
    - 公布者/订阅者(publisher/subscriber)模型中,当一个外部事件(新的产品,消息的出现等等)被触发时,通知邮件列表中的订阅者

    Observer模式的长处
    - 对象之间能够进行同步通信
    - 能够同一时候通知一到多个关联对象
    - 对象之间的关系以松耦合的形式组合,互不依赖


    Observer模式的角色:
    Subject(被观察者)
        被观察的对象。当须要被观察的状态发生变化时,须要通知队列中全部观察者对象。Subject须要维持(加入,删除,通知)一个观察者对象的队列列表。
    ConcreteSubject
        被观察者的详细实现。包括一些主要的属性状态及其它操作。
    Observer(观察者)
        接口或抽象类。当Subject的状态发生变化时,Observer对象将通过一个callback函数得到通知。
    ConcreteObserver
        观察者的详细实现。得到通知后将完毕一些详细的业务逻辑处理。

    package gof23;
    
    import java.util.LinkedList;
    import java.util.List;
    
    public class ObserverTest {
    	public static void main(String[] args) {
    		Subject boss = new Boss();
    		
    		StockObserver colleague1 = new StockObserver("张三", boss);
    		NBAObserver colleague2 = new NBAObserver("李四", boss);
    		
    		boss.attach(colleague1);
    		boss.attach(colleague2);
    		
    		boss.setAction("你们的老板我第一次回来了");
    		boss.notifyObserver();
    		System.out.println();
    		boss.detach(colleague2);
    		boss.setAction("你们的老板我第二次回来了");
    		boss.notifyObserver();
    	}
    }
    
    /*
     * 通知者接口
     */
    interface Subject{
    	int i =10;
    	//添加观察者
    	public void attach(Observer observer);
    	//移除观察者
    	public void detach(Observer observer);
    	//通知
    	public void notifyObserver();
    	//返回状态
    	public String getAction();
    	//设置状态
    	public void setAction(String action);
    }
    
    /*
     * 老板作为通知者
     */
    class Boss implements Subject {
    	private List<Observer> observers = new LinkedList<>();
    	private String action;
    	@Override
    	public void attach(Observer observer) {
    		observers.add(observer);
    	}
    
    	@Override
    	public void detach(Observer observer) {
    		observers.remove(observer);
    	}
    
    	@Override
    	public void notifyObserver() {
    		for(Observer observer : observers) {
    			observer.update();
    		}
    	}
    
    	public String getAction() {
    		return action;
    	}
    
    	public void setAction(String action) {
    		this.action = action;
    	}
    }
    
    /*
     * 秘书作为通知者
     */
    class Secretary implements Subject {
    	private List<Observer> observers = new LinkedList<>();
    	private String action;
    	@Override
    	public void attach(Observer observer) {
    		observers.add(observer);
    	}
    
    	@Override
    	public void detach(Observer observer) {
    		observers.remove(observer);
    	}
    
    	@Override
    	public void notifyObserver() {
    		for(Observer observer : observers) {
    			observer.update();
    		}
    	}
    
    	public String getAction() {
    		return action;
    	}
    
    	public void setAction(String action) {
    		this.action = action;
    	}
    }
    
    /*
     * 观察者抽象类
     */
    abstract class Observer {
    	protected String name;
    	protected Subject subject;
    	
    	public Observer(String name, Subject sub){
    		this.name = name;
    		this.subject = sub;
    	}
    	public abstract void update();
    }
    
    /*
     * 股票观察者
     */
    class StockObserver extends Observer {
    
    	public StockObserver(String name, Subject sub) {
    		super(name, sub);
    	}
    
    	@Override
    	public void update() {
    		System.out.println(name + "," + subject.getAction() + " 关闭股票行情,继续工作!");
    	}
    	
    }
    
    /*
     * NBA观察者
     */
    class NBAObserver extends Observer {
    
    	public NBAObserver(String name, Subject sub) {
    		super(name, sub);
    	}
    
    	@Override
    	public void update() {
    		System.out.println(name + "," + subject.getAction() + " 关闭NBA直播,继续工作!");
    	}
    	
    }

    执行结果为:

    张三,你们的老板我第一次回来了 关闭股票行情,继续工作!
    李四,你们的老板我第一次回来了 关闭NBA直播,继续工作!
    
    张三,你们的老板我第二次回来了 关闭股票行情,继续工作!
    


  • 相关阅读:
    VSCode前端 插件
    restframework 分页组件、响应器
    restframework 解析器、渲染器、url控制组件
    __getattr__
    apply和call的用法
    继承
    原型的指向改变
    局部变量变全局变量
    构造函数和实例对象和原型对象之间的关系
    _proto_和prototype
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4050002.html
Copyright © 2020-2023  润新知