概述:JAVA观测者模式是23种设计模式中比较常用的设计模式之一,在实际项目开发中都或多或少的见到过他的身影,今天,我们就一起来聊聊观测者模式是怎样实现的吧。
举个栗子:大家应该都玩过网游吧,记得我以前玩的一个网游(名字就不说了,怕被笑....),每到了节假日,都有这样的活动,游戏规则是这样的。到了游戏活动开始的时候,游戏的美女GM就会随机出现在游戏的地图,然后一个游戏广播就会以红名的消息提示告诉玩家他的位置,这样玩家就会去找他,最先找到他的就有丰厚的奖品。这也算游戏公司的一种拉近与玩家的策略吧。这里面就涉及到了观测者模式。让我细细的分析到来:
观测者:玩家1,玩家2,.....玩家n
被观测者:美女GM(多少雄性玩家等着她呢.....)
观测者抽象:包含观察者收到被观测者消息通知时的处理逻辑方法
被观测者抽象:其中包含 1.增加观察者的方法 2.移除观测者的方法 3.通知所有观察者有消息更新的方法
先来一个代码结构图分析吧:
好了,分析了这么多,是时候上代码了:
GM的抽象类:
package com.example.tianhaobing;
public interface GM {
public void addObserve(Player play); //增加观察者
public void removeObserve(Player player);//移除观测者
public void notifyObserve(); //通知所有的观测者
}
玩家的抽象类:
package com.example.tianhaobing;
public interface Player {
public void receive(String msg);//玩家收到消息
public void Register(GM gm); //玩家设置允许收到系统消息
public void unRegister(GM gm);//玩家设置不允许收到系统消息,恐龙妹谁想去...
}
美女GM的类:
package com.example.tianhaobing;
import java.util.ArrayList;
import java.util.List;
public class beauty_GM implements GM{
List<Player>players=new ArrayList<Player>();
private String msg;
@Override
public void addObserve(Player player) {
// TODO Auto-generated method stub
players.add(player);
}
@Override
public void removeObserve(Player player) {
// TODO Auto-generated method stub
int index = players.indexOf(player);
if (index >= 0)
{
players.remove(index);
}
} //移除观察者方法
@Override
public void notifyObserve() {
// TODO Auto-generated method stub
for(Player player: players){
player.receive(msg);
}
} //通知所有观察者,有消息来了
public void sendMsg(String msg){
this.msg=msg;
notifyObserve();
} //发送消息,同时通知玩家,我在哪里,找到我就让你嘿嘿嘿
}
玩家一的类:
package com.example.tianhaobing;
public class Player1 implements Player{
@Override
public void receive(String msg) {
// TODO Auto-generated method stub
System.out.println("玩家一收到来自美女GM的消息:"+msg);
} //这里的msg具体值由美女GM发出来
@Override
public void Register(GM gm) {
// TODO Auto-generated method stub
gm.addObserve(this);
} //将自己添加到美女GM的通知目标
@Override
public void unRegister(GM gm) {
// TODO Auto-generated method stub
gm.removeObserve(this);
} //将自己从美女GM的通知目标中移除
}
玩家二的类:
package com.example.tianhaobing;
public class Player2 implements Player{
@Override
public void receive(String msg) {
// TODO Auto-generated method stub
System.out.println("玩家二收到来自美女GM的消息:"+msg);
}
@Override
public void Register(GM gm) {
// TODO Auto-generated method stub
gm.addObserve(this);
} //玩家二允许收到系统消息
@Override
public void unRegister(GM gm) {
// TODO Auto-generated method stub
gm.removeObserve(this);
} //玩家二同样,对活动不敢兴趣
}
客户端调用类(主函数):
package com.example.tianhaobing;
/**
* @author tianhao
*
*/
public class Client {
public static void main(String[] msg) {
beauty_GM beautyMM = new beauty_GM();
Player1 player1 = new Player1();
Player2 player2 = new Player2();
player1.Register(beautyMM); // 玩家一允许收到系统消息
player2.Register(beautyMM);// 玩家二允许收到系统消息
// 美女GM发送了通知,玩家一和玩家二都能收到,因为他们都允许收到系统消息
beautyMM.sendMsg("来找我,找到我就让你嘿嘿嘿...");
//玩家一率先找到了美女GM,正准备嘿嘿嘿的时候,美女摘下面具,我曹,恐龙
//于是,玩家一再也不敢玩这种游戏,所以他设置了以后再也不收系统消息,现在只有一脸懵逼的玩家二能收到消息了
player1.unRegister(beautyMM);
beautyMM.sendMsg("来找我,找到我就让你嘿嘿嘿...");
}
}
执行结果如下:
好了,以上就是观察者模式的简单实现,其实JAVA中已经帮我们实现好了观察者模式,如想了解,欢迎留言。也可以和我单独交流联系,谢谢大家支持