zoukankan      html  css  js  c++  java
  • 设计模式之观察者模式

    1、类图

    观察者模式结构:

    实例类图

    2、创建项目

    …………………………

    3、 AllyControlCenter:指挥部(战队控制中心)类,充当抽象目标类 

    using System;

    using System.Collections.Generic; 

    namespace ObserverSample

    {

        abstract class AllyControlCenter

        {

            protected string allyName; //战队名称

            protected List<IObserver> players = new List<IObserver>(); //定义一个集合用于存储战队成员

            public void SetAllyName(string allyName)

            {

                this.allyName = allyName;

            }

            public string GetAllyName()

            {

                return this.allyName;

            }

            //注册方法

            public void Join(IObserver obs)

            {

                Console.WriteLine("{0}加入{1}战队!", obs.Name, this.allyName);

        players.Add(obs);

        }

            //注销方法

            public void Quit(IObserver obs)

            {

                Console.WriteLine("{0}退出{1}战队!", obs.Name, this.allyName);

        players.Remove(obs);

        }

            //声明抽象通知方法

            public abstract void NotifyObserver(string name);

        }

    }

    4、 ConcreteAllyControlCenter:具体指挥部类,充当具体目标类

    using System;

    namespace ObserverSample

    {

        class ConcreteAllyControlCenter : AllyControlCenter

        {

            public ConcreteAllyControlCenter(string allyName)

            {

                Console.WriteLine("{0}战队组建成功!", allyName);

                Console.WriteLine("----------------------------");

        this.allyName = allyName;

        }

            //实现通知方法

            public override void NotifyObserver(string name)

            {

                Console.WriteLine("{0}战队紧急通知,盟友{1}遭受敌人攻击!", this.allyName, name);

                //遍历观察者集合,调用每一个盟友(自己除外)的支援方法

                foreach(object obs in players)

                {

                    if (!((IObserver)obs).Name.Equals(name))

                    {

                        ((IObserver)obs).Help();

                    }

                }

        }

        }

    }

    5、 IObserver:抽象观察者类

    namespace ObserverSample

    {

        interface IObserver

        {

            string Name

            {

                get;

                set;

            }

            void Help(); //声明支援盟友方法

            void BeAttacked(AllyControlCenter acc); //声明遭受攻击方法

        }

    }

    6、 Player:战队成员类,充当具体观察者类

    using System;

    namespace ObserverSample

    {

        class Player : IObserver

        {

            private string name;

            public Player(string name)

            {

                this.name = name;

            }

            public string Name

            {

                get { return name; }

                set { name = value; }

            } 

            //支援盟友方法的实现

            public void Help()

            {

                Console.WriteLine("坚持住,{0}来救你!", this.name);

        } 

            //遭受攻击方法的实现,当遭受攻击时将调用战队控制中心类的通知方法NotifyObserver()来通知盟友

            public void BeAttacked(AllyControlCenter acc)

            {

                Console.WriteLine("{0}被攻击!", this.name);

                acc.NotifyObserver(name);

        }

        }

    7、 Program:客户端测试类

    using System; 

    namespace ObserverSample

    {

        class Program

        {

            static void Main(string[] args)

            {

                //定义观察目标对象

                AllyControlCenter acc;

                acc = new ConcreteAllyControlCenter("金庸群侠");

                //定义四个观察者对象

                IObserver player1, player2, player3, player4;

                player1 = new Player("杨过");

                acc.Join(player1); 

                player2 = new Player("令狐冲");

                acc.Join(player2);

                player3 = new Player("张无忌");

                acc.Join(player3);

                player4 = new Player("段誉");

                acc.Join(player4);

                //某成员遭受攻击

                player1.BeAttacked(acc);

                Console.Read();

            }

        }

    }

    8、 结果及分析,编译并运行程序,输出结果如下:

  • 相关阅读:
    软件部门每年耗资大约100亿到200多亿美元,但没有研发出任何具有说服力的产品,因此华为决定关闭
    Qt Model/View理解(二)---构造model(细心研读,发现超简单,Model就是做三件事:返回行数量、列数量、data如何显示。然后把model与view联系起来即可,两个例子都是如此)good
    linux 下用find命令查找文件,rm命令删除文件
    北电之死:谁谋杀了华为的对手?——银湖资本(Silver Lake)董事总经理爱德华·詹德出任CEO,既不了解华为,也不重视中国,直截了当地否决了收购华为
    搞定JavaScript正则表达式
    Orleans3.0
    CSS盒模型
    作用域和闭包
    NServiceBus是.Net平台下的开源的消息服务框架
    [1]System.Reflection.Emit
  • 原文地址:https://www.cnblogs.com/cqxhl/p/6097423.html
Copyright © 2011-2022 走看看