设计模式之观察者模式

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、 结果及分析,编译并运行程序,输出结果如下:

原文地址:https://www.cnblogs.com/cqxhl/p/6097423.html