本人原博地址:http://blog.saymagic.cn/blog.php?id=16
设想一个五人局,孙权是主,其余四人依次为曹操,祝融,夏侯敦,郭嘉,开局了,主公孙权放了一个南蛮,想一想这时会有什么发生呢,主会说,小心啊,我要放南蛮了,曹操一看,我是内丫,南蛮,卖血我要收了它!!一会在南别人去,于是曹操掉一滴血拿了南蛮,祝融一看,我不怕呀,要不是曹操小子这南蛮就是我的了,到夏侯敦了,他一想,我是反贼呀,我要掉血让孙权弃牌,于是夏侯敦又掉了一滴血,最后是郭嘉,做为忠臣的它一看事情不妙,掉血,给主公牌,于是郭嘉掉了一滴血。想一想,一个南蛮放完了,每个人都有每个人的反应,这是什么呢?这就是观察者模式,用一句简单的话来说观察者模式就是一个具体主题(ConcreteSubject)角色在发生变化时,通知具体观察者(ConcreteObserver)角色,然后具体观察者就可以根据此消息做出反应,在这局三国杀里,孙权就是具体主题(ConcreteSubject),而其他四人则是具体观察者(ConcreteObserver),孙权负责通知各个人物我放了南蛮,其它人则都会收到消息并作出反映,理解了吗?那具体代码怎么写呢?
首先,我们根据依赖倒转原则,我们要面向抽象编程,所以,孙权作为具体主题(ConcreteSubject),他就应该集成一个抽象Subject,这样如果下次曹操什么的要发消息时只需要再来继承这个抽象Subject就好了,并且,这个抽象Subject里面要有一个List数组,用来存贮一会孙权要给谁发送消息,在发消息时只需要遍历数组元素调用数组里的人物收到通知的方法就好,它的类图如下:
所以,抽象Subject代码如下:
import java.util.*;
public class Subject {
private List<Observer> list = new ArrayList<Observer>();
public void 发通知() {
// TODO: implement
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public void attach(Observer observer){
list.add(observer);
}
public void detach(Observer observer){
list.remove(observer);
}
/**
* 通知所有注册的观察者对象
*/
public void nodifyObservers(){
for(Observer observer : list){
observer.做出反映();
}
}
}
而作为具体主题(ConcreteSubject)的孙权,他只需要继承这个抽象Subject,覆盖抽象Subject的发通知方法,在里面再去调用抽象Subject的nodifyObservers()方法即可,代码如下:
import java.util.*;
public class 孙权 extends Subject {
public 孙权(){
}
public void 发通知() {
System.out.println("我是孙权,我要放南蛮了,各位注意!!!");
super.nodifyObservers();
}
}
Subject需要抽象出来,那么Observer也同样需要,这里我们把它定义成接口,其实大宝贝你要知道,接口和类都可以,他们的区别不是很多,当要有属性的时候一定要用抽象类了,但类不能多重继承,所以在抽象层不需要属性的的时候,接口是很好的选择,这里我们定义Observer抽象接口,里面定义方法‘做出反映’,代码很简单:
import java.util.*;
public interface Observer {
void 做出反映();
}
对于四个观察者则简单了。这需要实现Observer借口,实现里面‘做出反映’函数即可,这里随便列出曹操类的代码:
import java.util.*;
public class 曹操 implements Observer {
public void 做出反映() {
System.out.println("我是曹操我要掉血收南蛮");
}
}
最后是客户端,他只需要将曹操祝融等人物注册到孙权的List里面,这样,孙权发送方南蛮通知的时候,程序通过遍历数组就会通知每一个人由南蛮了,代码如下:
public class Client {
public static void main(String[] args) {
Subject sunquan = new 孙权();
Observer caocao = new 曹操();
Observer zhurong = new 祝融();
Observer xiahoudun = new 夏侯惇();
Observer guojia = new 郭嘉();
sunquan.attach(caocao);
sunquan.attach(zhurong);
sunquan.attach(xiahoudun);
sunquan.attach(guojia);
sunquan.发通知();
}
}
好啦,最后运行一下看结果吧:
分享到:
相关推荐
三国杀Online的局域网版,客户端采用盛大三国杀桌面版,操作便捷。 /* 使用说明 */ 1.未安装AdobeAir的首先从网上下载安装“Adobe Air” 2.确保"Sgs_MoonServer"安装路径不包含中文 3.运行“MoonServer.exe”打开...
三国杀游戏牌模板
三国杀标准包,风火山林,神将,一将成名,SP包,以及牌组资源
手机三国杀,支持单机游戏,也支持蓝牙对战,java版的,键盘触屏通杀。好东西啊
三国杀源代码,
三国杀。
cpp中,有三国杀全代码,2490行
Python+tornado 服务器, WebSocket 通信, B/S 架构三国杀源码. (更新天香/藤甲/朱雀羽扇)
ps三国杀模板
c++小游戏三国杀 2000都行代码
可以把此文件放在单机游戏,直接复制进太阳神三国杀的根目录里,就能加载里面的武将,还能通过lua修改武将数量或者武将技能。
自己写的Java基于swing的一个简易单机三国杀。有简易的AI支持。
采用C++开发的基于控制台的应用程序. 完成三国杀部分基本功能:杀,闪,桃,无中生有,过河拆桥,无懈可击,顺手牵羊,诸葛连弩,青釭剑,+1马,-1马. 三国杀最复杂之处在于逻辑性直观但是很不好把握.
三国杀C语言设计文档,内含C语言编程流程图(visio画出),以及编码流程,可以知道编码。
三国杀打印版高清图片,可下载下来直接A4纸张打印
三国杀资源提取器.rar 三国杀资源提取器.rar 三国杀资源提取器.rar 三国杀资源提取器.rar 三国杀资源提取器.rar 三国杀资源提取器.rar
三国杀武将牌制作模板及教程第三版(附神卡模板
看完这个源代码的确挺有收获的,毕竟是几位牛人写是,希望大家共同进步,分享好资源
三国杀 单机版 ,使用宏开发 excel搞定
三国杀Authorware作品(神级作品)