观察者模式

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

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

好吧,言归正传。

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



原文地址:https://www.cnblogs.com/MedivhQ/p/4074978.html