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

    观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。

    public interface IHanfeizi {
    	public void haveBreakFast();
    	public void haveFun();
    }
    

    被观察者接口

    public interface Observable {
    	public void addObserver(Observer observer);
    	
    	public void deleteObserver(Observer observer);
    	
    	public void notifyObservers(String context);
    }
    

    观察者接口

    public interface Observer {
    	public void observe(String context);
    }
    

    被观察者实现类

    public class Hanfeizi implements Observable, IHanfeizi {
    
    	private List<Observer> observerList = new ArrayList<>();
    	@Override
    	public void haveBreakFast() {
    		System.out.println("韩非子:开始吃饭了。。。");
    		notifyObservers("韩非子在吃饭");
    	}
    
    	@Override
    	public void haveFun() {
    		System.out.println("韩非子:开始娱乐了。。。");
    		notifyObservers("韩非子在娱乐");
    	}
    
    	@Override
    	public void addObserver(Observer observer) {
    		observerList.add(observer);
    	}
    
    	@Override
    	public void deleteObserver(Observer observer) {
    		observerList.remove(observer);
    	}
    
    	@Override
    	public void notifyObservers(String context) {
    		for (Observer observer : observerList) {
    			observer.observe(context);
    		}
    	}
    
    }
    

    观察者1

    public class Lisi implements Observer {
    
    	@Override
    	public void observe(String context) {
    		System.out.println("李斯:观察到韩非子活动,想boss汇报。");
    		report(context);
    		System.out.println("李斯汇报完毕");
    	}
    	
    	public void report(String reportContext) {
    		System.out.println("李斯:报告老板,观察到韩非子活动了," + reportContext);
    	}
    
    }
    

    观察者2

    public class Wangsi implements Observer {
    
    	@Override
    	public void observe(String context) {
    		System.out.println("王斯:观察到韩非子活动,+" + context);
    		cry(context);
    		System.out.println("王斯哭完了。");
    	}
    	
    	public void cry(String context) {
    		System.out.println("王斯:因为" + context + "所以我伤心。。。");
    	}
    
    }
    

    场景类

    public class Main {
    	public static void main(String[] args) {
    		Observer lisi = new Lisi();
    		Observer wangsi = new Wangsi();
    		Hanfeizi hanfeizi = new Hanfeizi();
    		hanfeizi.addObserver(lisi);
    		hanfeizi.addObserver(wangsi);
    		hanfeizi.haveBreakFast();
    		hanfeizi.haveFun();
    	}
    }
    

    运行结果如下:

    韩非子:开始吃饭了。。。
    李斯:观察到韩非子活动,想boss汇报。
    李斯:报告老板,观察到韩非子活动了,韩非子在吃饭
    李斯汇报完毕
    王斯:观察到韩非子活动,+韩非子在吃饭
    王斯:因为韩非子在吃饭所以我伤心。。。
    王斯哭完了。
    韩非子:开始娱乐了。。。
    李斯:观察到韩非子活动,想boss汇报。
    李斯:报告老板,观察到韩非子活动了,韩非子在娱乐
    李斯汇报完毕
    王斯:观察到韩非子活动,+韩非子在娱乐
    王斯:因为韩非子在娱乐所以我伤心。。。
    王斯哭完了。
    
  • 相关阅读:
    论如何O(1)快速乘
    luogu3605晋升者计数
    分数规划小结
    洛谷 P1589 泥泞路 & 2019青岛市竞赛(贪心)
    洛谷 P3368 【模板】树状数组 2(区间加,单点查询)
    前缀和序列 & 差分序列
    洛谷 P3374 【模板】树状数组 1(单点加,区间和)
    2019青岛市程序设计竞赛游记
    0x3f3f3f3f 0xbfbfbfbf 等的原理及应用
    memset 初始化数组 & 实现原理
  • 原文地址:https://www.cnblogs.com/umgsai/p/6004993.html
Copyright © 2011-2022 走看看