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汇报。
    李斯:报告老板,观察到韩非子活动了,韩非子在娱乐
    李斯汇报完毕
    王斯:观察到韩非子活动,+韩非子在娱乐
    王斯:因为韩非子在娱乐所以我伤心。。。
    王斯哭完了。
    
  • 相关阅读:
    bzoj3932 [CQOI2015]任务查询系统
    bzoj1901 Zju2112 Dynamic Rankings
    bzoj3524 [Poi2014]Couriers/2223 [Coci 2009]PATULJCI
    bzoj1529 [POI2005]ska Piggy banks
    bzoj1552 [Cerc2007]robotic sort
    bzoj2208 [Jsoi2010]连通数
    2016NOI冬令营day5
    A1035 Password (20)(20 分)
    1048 数字加密(20 分)
    福尔摩斯的约会
  • 原文地址:https://www.cnblogs.com/umgsai/p/6004993.html
Copyright © 2011-2022 走看看