观察者模式

观察者模式又叫做 发布-订阅模式(Publish/Subscribe模式)


观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。

这个主题对象在状态发生变化的时, 会同时通知所有观察者对象,使他们能够自动更新自己。  

 

跟观察者一样,具体的通知者可能也有多个,他们也许有各自的一些方法。


观察者模式的目的

将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象的一致性。

我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。

当一个对象的改变需要同时改变其他对象,且不知道具体有多少个对象有待改变时,应该考虑使用观察者模式。

观察者模式所做的工作其实就是在解除耦合。让耦合的双方都依赖于各自对应的抽象,而不是依赖于具体。

从而使得各自的变化都不会影响另一边变化。

①观察者类:

namespace ObserverMode
{
    abstract class GuanChaZhe
    {
        public string _name;
        protected TongZhiZhe _tongzhizhe;
        protected Form1 _form1;

        //protected string _name;
        //protected TongZhiZhe _tongzhizhe;
        //protected Form1 _form1;

        public GuanChaZhe( Form1 form1, string name, TongZhiZhe tongzhizhe)
        {
            this._form1 = form1;
            this._name = name;
            this._tongzhizhe = tongzhizhe;
        }

        //public void Updata()
        //{
        //    _form1.label4.Text = _tongzhizhe.Name + ": " + _tongzhizhe.Action;
        //    _form1.label1.Text = this._name + ":关闭欧冠直播,继续工作!";
        //}

        public abstract void Updata();
   
    }

    //大师兄
    class DaShiXiong : GuanChaZhe
    {

        public DaShiXiong( Form1 form1, string name, TongZhiZhe tongzhizhe)
            : base(form1, name, tongzhizhe)
        {

        }

        public override void Updata()
        {
            _form1.label4.Text = _tongzhizhe.Name + ": " + _tongzhizhe.Action;
            _form1.label1.Text = this._name + ":关闭欧冠直播,继续工作!" ;
        }
    }
    //城西
    class ChenXi : GuanChaZhe
    {

        public ChenXi( Form1 form1, string name, TongZhiZhe tongzhizhe)
            : base(form1, name, tongzhizhe)
        {

        }

        public override void Updata()
        {
            _form1.label4.Text = _tongzhizhe.Name + ": " + _tongzhizhe.Action;
            _form1.label2.Text = this._name + ":关闭某某美图,继续工作!" ;
        }
    }
    //周游
    class ZhouYou : GuanChaZhe
    {

        public ZhouYou( Form1 form1, string name, TongZhiZhe tongzhizhe)
            : base(form1, name, tongzhizhe)
        {

        }

        public override void Updata()
        {
            _form1.label4.Text = _tongzhizhe.Name + ": " + _tongzhizhe.Action;
            _form1.label3.Text = this._name + ":关闭欧冠直播,继续工作!" ;
        }
    }
}

②通知者类:

abstract class TongZhiZhe
    {
        protected List< GuanChaZhe> GuanChaZheMen = new List <GuanChaZhe >();
        private string _name;
        private string _action;

        public string Name
        {
            get { return _name;}
            set { _name = value; }
        }
        public string Action
        {
            get { return _action; }
            set { _action = value; }
        }

        public TongZhiZhe( string name)
        {
            Name = name;
        }

        public abstract void Add( GuanChaZhe guanchazhe);


        public abstract void Notify();
    }
    //小晴
    class Xiaoqing : TongZhiZhe
    {
        public Xiaoqing( string name)
            : base(name)
        {

        }

        public override void Add( GuanChaZhe guanchazhe)
        {
            if (guanchazhe._name == "大师兄")
                return;
            GuanChaZheMen.Add(guanchazhe);       
        }

        public override void Notify()
        {
            foreach ( GuanChaZhe item in GuanChaZheMen)
            {           
                item.Updata();
            }
        }
    }

③客户端:

//通知者
            TongZhiZhe xiaoqing = new Xiaoqing ("通知者" );

            //观察者
            GuanChaZhe dashixiong = new DaShiXiong (this , "大师兄" , xiaoqing);
            GuanChaZhe chenxi = new ChenXi (this , "城西" , xiaoqing);
            GuanChaZhe zhouyou = new ZhouYou (this , "周游" , xiaoqing);

            //通知者记录
            xiaoqing.Add(dashixiong);
            xiaoqing.Add(chenxi);
            xiaoqing.Add(zhouyou);

            //tongzhizhe.Add(dashixiong);
            //tongzhizhe.Add(chenxi);
            //tongzhizhe.Add(zhouyou);

            //发现老板回来了
            xiaoqing.Action = "老板回来了!" ;

            //通知者通知记录的观察者
            xiaoqing.Notify();



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值