• 设计模式-观察者模式


    观察者模式是对象的行为模式,又叫发布-订阅(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汇报。
    李斯:报告老板,观察到韩非子活动了,韩非子在娱乐
    李斯汇报完毕
    王斯:观察到韩非子活动,+韩非子在娱乐
    王斯:因为韩非子在娱乐所以我伤心。。。
    王斯哭完了。
    
  • 相关阅读:
    HotRing: A Hotspot-Aware In-Memory Key-Value Store(FAST ’20)
    java中List 和 Set 的区别
    多线程编程(3)——synchronized原理以及使用
    从同步阻塞到异步非阻塞角度看网络编程
    多线程编程(2)—线程安全
    多线程编程(1)
    Maven项目下使用log4j
    LeetCode正则表达式匹配
    Java I/O模型及其底层原理
    这一年太快
  • 原文地址:https://www.cnblogs.com/umgsai/p/6004993.html
Copyright © 2020-2023  润新知