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

    每每提到观察者,我的情绪都非常激动,玩过魔兽世界的人都知道: 观察者-奥尔加隆。观察者模式跟游戏中的一种模式比较相像。

           万神殿可以给每个星球配置一名观察者,也可以随时控制观察者。而观察者则负责分析星球的动向,操作星球系统,将信息反馈给万神殿万神殿也可以通过群发微信,把信息传给各个星球的观察者观察者再根据指示执行动作。

    好吧,言归正传。

    1)抽象主题角色

       控制观察者的操作机构,我们可以成为 万神殿。万神殿可以增加观察者,删除观察者,发信息给观察者。观察者随时查看万神殿的信息,并执行操作。

    package com.medivh.wow;
    
    public interface Pantheon
    {
    	/*
    	 * 万神殿所拥有的方法
    	 */
    	public void addObserver(Observer observer);
    	
    	public void removeObserver(Observer observer);
    	
    	public void SendMessage(String msg,String observerName);
    }

    2)具体主题角色

    万神殿的具体实现方法

    package com.medivh.wow;
    
    public class Test
    {
    		public static void main(String[] args)
    		{
    			Pantheon sargeras = new PantheonService();
    			
    			Observer orrGallon = new ObserverService();
    			
    			Observer orrGallon1 = new ObserverService();
    			
    			Observer orrGallon2 = new ObserverService();
    			
    			/*
    			 * 万神殿添加了3个观察者
    			 */
    			sargeras.addObserver(orrGallon);
    			sargeras.addObserver(orrGallon1);
    			sargeras.addObserver(orrGallon2);
    			
    			sargeras.SendMessage("Formatting the planet Azeroth","argus");//万神殿向观察者发出'格式化艾泽拉斯星球信息';
    			
    			System.out.println("******************************");
    			
    			sargeras.removeObserver(orrGallon2);//删除了一名观察者
    			
    			sargeras.SendMessage("Omega duplicate code","delano");//重复代码欧米伽
    		}
    }	


    3)抽象观察者角色

     

    package com.medivh.wow;
    
    public interface Observer
    {
    		
    		/*
    		 * 观察者可执行方法
    		 */
    		public void execution(String action);
    }
    



    4)具体观察者角色

    package com.medivh.wow;
    
    public class ObserverService implements Observer
    {
    	
    	@Override
    	public void execution(String action)
    	{
    			System.out.println(action);
    	}
    }
    

    5)测试类

    package com.medivh.wow;
    
    public class Test
    {
    		public static void main(String[] args)
    		{
    			Pantheon sargeras = new PantheonService();
    			
    			Observer orrGallon = new ObserverService();
    			
    			Observer orrGallon1 = new ObserverService();
    			
    			Observer orrGallon2 = new ObserverService();
    			
    			/*
    			 * 万神殿添加了3个观察者
    			 */
    			sargeras.addObserver(orrGallon);
    			sargeras.addObserver(orrGallon1);
    			sargeras.addObserver(orrGallon2);
    			
    			sargeras.SendMessage("Formatting the planet Azeroth","argus");//万神殿向观察者发出'格式化艾泽拉斯星球信息';
    			
    			System.out.println("******************************");
    			
    			sargeras.removeObserver(orrGallon2);//删除了一名观察者
    			
    			sargeras.SendMessage("Omega duplicate code","delano");//重复代码欧米伽
    		}
    }	
    


    6)测试结果

    已经发送至com.medivh.wow.ObserverService@1e3cd51
    argus需要执行:Formatting the planet Azeroth
    已经发送至com.medivh.wow.ObserverService@bc8e1e
    argus需要执行:Formatting the planet Azeroth
    已经发送至com.medivh.wow.ObserverService@11671b2
    argus需要执行:Formatting the planet Azeroth
    ******************************
    已经发送至com.medivh.wow.ObserverService@1e3cd51
    delano需要执行:Omega duplicate code
    已经发送至com.medivh.wow.ObserverService@bc8e1e
    delano需要执行:Omega duplicate code

    总的来说多个观察者同时监听万神殿的信息,如果万神殿信息发生改变,那么观察者就执行相应的改变措施。

    下面是JDK对观察者模式的支持

    package com.medivh.learn12;
    
    import java.util.Observable;
    import java.util.Observer;
    
    public class TwoObservers
    {
    	public static void main(String[] args)
    	{
    		BeingWatched b = new BeingWatched();
    		
    		Watcher01 w1 = new Watcher01();
    		
    		Watcher02  w2 = new Watcher02();
    		
    		b.addObserver(w1);
    		b.addObserver(w2);
    		
    		b.count(9);
    		
    	}
    }
    class BeingWatched extends Observable
    {
    	void  count(int number)
    	{
    		for(;number>=0;number--)
    		{
    			this.setChanged();
    			
    			this.notifyObservers(number);
    		}
    	}
    }
    
    class Watcher01  implements Observer
    {
    
    	public void update(Observable o, Object arg)
    	{
    		System.out.println("Watcher01 is "+((Integer)arg).intValue());
    	}
    	
    }
    class Watcher02 implements Observer
    {
    
    	public void update(Observable o, Object arg)
    	{
    		if(((Integer)arg).intValue()<=5)
    		{
    			System.out.println("Watcher02 is"+((Integer)arg).intValue());
    		}
    	}
    	
    }


    程序结果为:

    Watcher01 is 9
    Watcher01 is 8
    Watcher01 is 7
    Watcher01 is 6
    Watcher02 is5
    Watcher01 is 5
    Watcher02 is4
    Watcher01 is 4
    Watcher02 is3
    Watcher01 is 3
    Watcher02 is2
    Watcher01 is 2
    Watcher02 is1
    Watcher01 is 1
    Watcher02 is0
    Watcher01 is 0



  • 相关阅读:
    HTML常用标记(完整版)
    理论精讲-教育知识与能力7-第四章 中学生学习心理
    前端面试题总结
    for-in 和for-of循环的区别
    Nginx部署多个vue前端项目
    vue项目PC端如何适配不同分辨率屏幕
    基于Vue的项目打包为移动端app
    js中Date对象
    React Router的Route的使用
    js中数组的sort() 方法
  • 原文地址:https://www.cnblogs.com/MedivhQ/p/3801407.html
Copyright © 2011-2022 走看看