《C#设计模式》==>观察者模式

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DesignPattern
{
    //观察者模式
    //定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象都得到通知并被自动更新
    internal class ObserverPattern
    {
    }

    #region 简单Demo
    //抽象目标类
    //abstract class Subject
    //{
    //    //定义一个观察者集合用于存储所有观察者对象
    //    protected ArrayList observes = new ArrayList();
    //    //声明抽象注册方法,用于向观察者集合中增加一个观察者
    //    public abstract void Attach(Observer observer);
    //    //声明抽象注销方法,用于在观察者集合中删除一个观察者
    //    public abstract void Detach(Observer observer);
    //    //声明抽象通知方法
    //    public abstract void Notify();
    //}

    具体目标类
    //class ConcrecteSubject : Subject
    //{
    //    public override void Attach(Observer observer)
    //    {
    //        observes.Add(observer);
    //    }

    //    public override void Detach(Observer observer)
    //    {
    //        observes.Remove(observer);
    //    }

    //    public override void Notify()
    //    {
    //        //遍历观察者集合,调用每一个观察者的响应方法
    //        foreach (object obs in observes)
    //        {
    //            ((Observer)obs).Update();
    //        }
    //    }
    //}
    抽象观察者
    //interface Observer
    //{
    //    void Update();
    //}
    具体观察者
    //class ConcreteObserver
    //{
    //    public void Update()
    //    {
    //        //具体更新代码

    //    }
    //}

    #endregion

    //实例代码

    //指挥部类,充当抽象目标类
    abstract class AllyControlCenter
    {
        protected string allyName;//战队名称
        protected List<IObserver> players = new List<IObserver>();//定义一个集合用于存储战队成员

        public void SetAllyName(string name)
        {
            this.allyName = name;
        }
        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);

    }

    //具体指挥部类  充当具体目标类
    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();
                }
            }
        }
    }

    //抽象观察者类
    interface IObserver
    {
        string Name { get; set; }
        void Help();              //声明支援盟友方法
        void BeAttacked(AllyControlCenter acc); //声明遭受攻击方法
    }

    //战队成员类   充当具体观察者类
    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);
        }
    }

    //客户端测试
    class Test11 {
        public void main() {
            //定义观察目标对象
            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);


            //输出
            //杨过加入金庸群侠战队!
            //令狐冲加入金庸群侠战队!
            //张无忌加入金庸群侠战队!
            //段誉加入金庸群侠战队!
            //杨过被攻击
            //金庸群侠战队紧急通知,盟友杨过遭受敌人攻击!
            //坚持住,令狐冲来救你
            //坚持住,张无忌来救你
            //坚持住,段誉来救你
        }
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值