来玩欢乐斗地主!纸牌游戏例子的ObserverPattern----观察者模式
2017-05-28 20:09
288 查看
(我不想讲的太过沉闷,所以每次都拿例子来讲解,希望大家喜欢)
首先还是定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
我们都玩过欢乐斗地主,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同理。
上面就是观察者模式的原理了。这个模式比较简单,也很常见。下面我们来简单看看具体的实现有那些步骤吧!
先说说这个游戏系统的代码:
下面来看看observer类的大致实现:
这里要注意,observer接口中的Updatef()方法是通过游戏系统循环调用的,也就是说,Observer的Update方法,Observer的子类不会去调用,每次都是Subject调用。Subject中的registerObserver()和removeObserver()这两个方法,在实现Subject的类中也不会调用,都是通过Observer去调用的。这是一种行为设计模式,自己定义的行为,是通过别人来调用的,再来作用给自身。
看完了,如果读者对与观察者模式有了一定的了解,或者这篇文章对你有益,就点个赞吧!!!(不懂得可以留言哦!欢迎留言)
首先还是定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
我们都玩过欢乐斗地主,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去调用的。这是一种行为设计模式,自己定义的行为,是通过别人来调用的,再来作用给自身。
看完了,如果读者对与观察者模式有了一定的了解,或者这篇文章对你有益,就点个赞吧!!!(不懂得可以留言哦!欢迎留言)
相关文章推荐
- 用最简单的例子理解观察者模式(Observer Pattern)
- 观察者模式(Observer Pattern)
- C#设计模式——观察者模式(Observer Pattern)
- 设计模式之观察者模式(Observer Pattern)
- 设计模式系列之三:观察者模式(Observer Pattern)
- 观察者模式(Observer Pattern)——让你的对象知悉现状
- 设计模式----行为型模式之观察者模式(Observer Pattern)
- 我所理解的设计模式(C++实现)——观察者模式(Observer Pattern)
- 使用委托和事件实现观察者模式(Observer Pattern)
- 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)
- 观察者模式 Observer Pattern
- 设计模式——行为型设计模之借助观察者模式(Observer Pattern)实现模块之间的解耦(四)
- Head First 设计模式——观察者模式(Observer Pattern) 之二
- Java中的观察者模式(Observer Pattern)学习
- C#设计模式(4)——观察者模式(Observer Pattern)
- C#设计模式——观察者模式(Observer Pattern)
- 观察者模式(Observer Pattern)
- 设计模式------观察者模式(ObserverPattern)和委托事件
- 观察者设计模式(Observer Pattern)
- Java Observer Pattern(观察者模式)