zoukankan      html  css  js  c++  java
  • 观察者模式

    观察者模式(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直播,继续工作!
    
    张三,你们的老板我第二次回来了 关闭股票行情,继续工作!
    


  • 相关阅读:
    English 2
    速算24点
    心理学1
    从微服务到函数式编程
    034 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 01 流程控制概述
    033 01 Android 零基础入门 01 Java基础语法 03 Java运算符 13 运算符和表达式知识点总结
    032 01 Android 零基础入门 01 Java基础语法 03 Java运算符 12 运算符和if-else条件语句的综合案例——闰年问题
    031 01 Android 零基础入门 01 Java基础语法 03 Java运算符 11 运算符的优先级
    030 01 Android 零基础入门 01 Java基础语法 03 Java运算符 10 条件运算符
    029 01 Android 零基础入门 01 Java基础语法 03 Java运算符 09 逻辑“非”运算符
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4050002.html
Copyright © 2011-2022 走看看