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
这个观察者模式写的比较形象,比什么猫一叫,什么的强多了。