JAVA设计模式之观察者模式

概述: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中已经帮我们实现好了观察者模式,如想了解,欢迎留言。也可以和我单独交流联系,谢谢大家支持








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值