2018年12月25日 16:39
原创作品,转载时请务必以超链接形式标明文章原始出处,否则将追究法律责任。
观察者模式么,就是一堆的观察对象,当有通知时,观察者做出相应的动作。在这里我们就以收复台海作为例子,军委一声令下,各部门立即战斗。军委同时掌管参战的部门,可以随时增加或者减少战斗部门。
首先先定义军事部门接口,包含战斗方法。
public interface 军事部门 { void 战斗(); } public class 导弹部队 : 军事部门 { public void 战斗() { Console.WriteLine("发射弹道导弹"); } } public class 潜艇部队 : 军事部门 { public void 战斗() { Console.WriteLine("发射鱼雷"); } } public class 信息部队 : 军事部门 { public void 战斗() { Console.WriteLine("收集敌方情报"); } }
三个部门战斗内容不一样,下面我们看一下军委发布命令后,各部门怎么战斗。
public class 中央军委 { List<军事部门> 军事部门集合; public 中央军委() { 军事部门集合 = new List<军事部门>(); } public 中央军委(List<军事部门> 军事部门集合) { this.军事部门集合 = 军事部门集合; } public void 增加军事部门(军事部门 军事部门对象) { 军事部门集合.Add(军事部门对象); } public void 减掉军事部门(军事部门 军事部门对象) { 军事部门集合.Remove(军事部门对象); } public void 发出战斗命令() { this.军事部门集合.ForEach(军事部门 => 军事部门.战斗()); }
很简单的,军委随时掌控增减,让他们战斗,看一下调用
中央军委 军委 = new 中央军委(); 军委.增加军事部门(new 导弹部队()); 军委.增加军事部门(new 潜艇部队()); 军委.增加军事部门(new 信息部队()); 军委.发出战斗命令();
执行效果如下
发射弹道导弹 发射鱼雷 收集敌方情报
这是一种简单的模式,还有一种是事件通知。
public void 增加军事部门(军事部门 军事部门对象) { this.战斗事件 += new 战斗委托(军事部门对象.战斗); } public void 减掉军事部门(军事部门 军事部门对象) { this.战斗事件 -= new 战斗委托(军事部门对象.战斗); } public void 发出战斗命令() { if (战斗事件 != null) { 战斗事件(); } this.战斗事件.Invoke(); } delegate void 战斗委托(); event 战斗委托 战斗事件;
定义事件,然后注册事件处理。调用和上面是一样的,不过这里我们也可以通过invoke去调用委托原型方法。
其实可以再简单点,不用事件,直接用委托就行了。
战斗委托 委托; public void 增加军事部门(军事部门 军事部门对象) { this.委托 += 军事部门对象.战斗; } public void 减掉军事部门(军事部门 军事部门对象) { this.委托 -= 军事部门对象.战斗; } public void 发出战斗命令() { 委托(); } delegate void 战斗委托();
执行结果也是一样的,好的,今天就到这里。
上一篇 设计模式之-适配器模式
下一篇 设计模式之-代理模式
发表评论
匿名
用户评论
匿名游客
2018年12月25日 22:15
这个观察者模式写的比较形象,比什么猫一叫,什么的强多了。