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汇报。
    李斯:报告老板,观察到韩非子活动了,韩非子在娱乐
    李斯汇报完毕
    王斯:观察到韩非子活动,+韩非子在娱乐
    王斯:因为韩非子在娱乐所以我伤心。。。
    王斯哭完了。
    
  • 相关阅读:
    STM32时钟树
    js jQuery函数 $.ajax()
    jQuery 语法
    jQuery介绍
    python笔记2 生成器 文件读写
    python笔记1,语法,函数,类和实例,异常
    Scrapy爬虫入门系列4抓取豆瓣Top250电影数据
    Scrapy爬虫入门系列3 将抓取到的数据存入数据库与验证数据有效性
    opus 规范 与参数解析
    开源播放器ijkplayer源码结构
  • 原文地址:https://www.cnblogs.com/umgsai/p/6004993.html
Copyright © 2011-2022 走看看