• C# 观察者模式(Observer)


    理解:订阅-发布。把所有需要通知的对象添加到发布者类里面。发布者更改自己状态后通知观察者

    代码:

    using System.Collections.Generic;
    using System.Windows.Forms;

    namespace DesignMode.Observer
    {
        //抽象发布者
        public abstract class Group
        {

            public abstract void Add(Friend friend);
            public abstract void Remove(Friend friend);
            public abstract void Notify();
        }


        public class Weibo : Group
        {
            private string state;
            public string State
            {
                get { return state; }
                set { state = value; }
            }

            private IList<Friend> subs = new List<Friend>();
            public override void Add(Friend friend)
            {
                subs.Add(friend);
            }
            public override void Remove(Friend friend)
            {
                subs.Remove(friend);
            }
            public override void Notify()
            {
                foreach (Friend f in subs)
                {
                    f.Accept();
                }
            }
        }

        // 抽象订阅者
        public abstract class Friend
        {
            public abstract void Accept();
        }

        public class ZhangSan : Friend
        {
            private string _myState;
            private string _name;
            private Weibo _wb;

            public ZhangSan(Weibo wb, string name)
            {
                this._name = name;
                this._wb = wb;
            }

            public override void Accept()
            {
                _myState = _wb.State;
                if (_myState.Equals("发送"))
                {
                    MessageBox.Show(_name + "收到WB信息");
                }
                else
                {
                    MessageBox.Show(_name + "等待WB信息");
                }
            }
        }

        public class LiSi : Friend
        {
            private string _myState;
            private string _name;
            private Weibo _wb;

            public LiSi(Weibo wb, string name)
            {
                this._name = name;
                this._wb = wb;
            }

            public override void Accept()
            {
                _myState = _wb.State;
                if (_myState.Equals("发送"))
                {
                    MessageBox.Show(_name + "收到WB信息");
                }
                else
                {
                    MessageBox.Show(_name + "等待WB信息");
                }
            }
        }

     } 

    客户端代码:

            private void btn_Observer_Click(object sender, EventArgs e)
            {
                Weibo wb = new Weibo();
                wb.Add(new ZhangSan(wb, "张三"));
                wb.Add(new LiSi(wb, "李四"));
                
                wb.State = "未发送";
                wb.Notify();

                wb.State = "发送";
                wb.Notify();} 
  • 相关阅读:
    【一天一个canvas】制作渐变式PPT背景(十五)
    【一天一个canvas】写文字(十四)
    【一天一个canvas】图像切割函数clip(十三)
    ThinkPHP 3.2 大写字母函数封装方法实例
    百度echarts 地图使用实例
    随机数生成
    需要修改php.ini文件支持操作,可不用直接操作php.ini
    定时多少时间调用指定URL
    自动调用接口
    tp5 Excel 批量导入
  • 原文地址:https://www.cnblogs.com/kavilee/p/2376497.html
Copyright © 2020-2023  润新知