观察者模式
每每提到观察者,我的情绪都非常激动,玩过魔兽世界的人都知道: 观察者-奥尔加隆。观察者模式跟游戏中的一种模式比较相像。
万神殿可以给每个星球配置一名观察者,也可以随时控制观察者。而观察者则负责分析星球的动向,操作星球系统,将信息反馈给万神殿。万神殿也可以通过群发微信,把信息传给各个星球的观察者。观察者再根据指示执行动作。
好吧,言归正传。
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