来玩欢乐斗地主!纸牌游戏例子的ObserverPattern----观察者模式

(我不想讲的太过沉闷,所以每次都拿例子来讲解,希望大家喜欢)

首先还是定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。


我们都玩过欢乐斗地主,3个人在一个桌子上玩斗地主,玩家出牌都可以从桌子上看见,这里其实就是一个观察者的设计模式。桌面上的出牌情况可以被3个玩家或者更多玩家看见,这就是典型的一对多的结构关系。玩家就是observer(观察者),观察者们得到桌子上(subject)显示的信息。下面就是一个简单的关系图:


subject(桌子)的信息发生变化,所有依赖于它的observer(3个玩家)就会看见subject发送的信息(m)。

类图如下:


首先看最上面的3个接口:subject,observer,device

Subject:这个接口有3个方法,registerObserver()是为了添加新的观察者(比如玩家进入这个座子,或者有观众),removeObserver()是移除所依附的观察者(如玩家离开),notifyObserver()是游戏一旦检测到信息改变(例如玩家除了张牌),则此方法用来将subject的信息发送给所有的observer。

Observer:这个接口主要是用来在Subject那里登记,即添加到subject的一个列表中,从而建立与subject的连接,Subject对象更新的时候,会调用所有observer的Update()方法。

Device:这个接口就是用来让游戏的信息显示在玩家的设备上。


注意了,这里的3个都是接口,比如Device,可以根据玩家设备的不同,在实现Display的时候可以有自己的代码。subject,observer同理。


上面就是观察者模式的原理了。这个模式比较简单,也很常见。下面我们来简单看看具体的实现有那些步骤吧!


先说说这个游戏系统的代码:

public class doudizhu implements Subject{//实现Subject接口的类
	private ArrayList observers;//ArrayList可以关联许多的用户
	private String info;//代指游戏出牌信息
	public doudizhu()
	{
		observers = new ArrayList();//构造的时候生成observers的集合
	}
	public void registerObserver(Observer o)
	{
		observers.add(o);//当用户加入的时候添加到游戏的observers列表中
	}
	public void removeObserver(Observer o)
	{
		int i = observers.indexOf(o);//寻找这个要取消关联的user
		if(i>=0) observers.remove(i);//移除此observer
	}
	public void notifyObservers()
	{
		for(int i=0;i<observers.size();i++){//循环遍历,调用所有观察者的update方法
			Observer observer = (Observer)observers.get(i);
			observer.update(String info);
		}
	}
	public void getInfo(){//当游戏的各项信息发生变化,则调用通知方法
		notifyObservers();
	}
}
上面就是subject接口的实现,应该很好理解吧!!(不懂得可以留言哦,别忘记点赞)


下面来看看observer类的大致实现:

public class Player implements Observer,Device{
	private String info;//代指游戏里面的信息
	private Subject subject;
	public Player(Subject subject){
		this.subject = subject;//初始化的时候,就让玩家关联一个桌子(实现subject接口的类)
		subject.registerObserver(this);//调用subject的登记方法!
	}
	public void update(String info){//参数info是从Subject中传来的信息哦!想一想就知道了
		//当这个函数将更新的信息存入临时变量
		this.info=info;
		display();
	}
	public void display(){
	…//将游戏信息显示在用户设备上
	}
}

这里要注意,observer接口中的Updatef()方法是通过游戏系统循环调用的,也就是说,Observer的Update方法,Observer的子类不会去调用,每次都是Subject调用。Subject中的registerObserver()和removeObserver()这两个方法,在实现Subject的类中也不会调用,都是通过Observer去调用的。这是一种行为设计模式,自己定义的行为,是通过别人来调用的,再来作用给自身。


看完了,如果读者对与观察者模式有了一定的了解,或者这篇文章对你有益,就点个赞吧!!!(不懂得可以留言哦!欢迎留言)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值