设计模式——观察者模式

观察者的定义:观察者模式(又被称为发布-订阅模式),属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。
使用场景:
A对象(观察者)对B对象(被观察者)的某种变化高度敏感,需要在B变化的一瞬间做出反应。举个例子,新闻里喜闻乐见的警察抓小偷,警察需要在小偷伸手作案的时候实施抓捕。在这个例子里,警察是观察者、小偷是被观察者,警察需要时刻盯着小偷的一举一动,才能保证不会错过任何瞬间。程序里的观察者和这种真正的【观察】略有不同,观察者不需要时刻盯着被观察者(例如A不需要每隔1ms就检查一次B的状态),二是采用注册(Register)或者成为订阅(Subscribe)的方式告诉被观察者:我需要你的某某状态,你要在它变化时通知我。采取这样被动的观察方式,既省去了反复检索状态的资源消耗,也能够得到最高的反馈速度。
代码走起:
例如在商城购买产品的时候每当下单成功以后,商城都会发送短信/站内信给工作销售人员和购买人员通知产品销售情况。
抽象类:产品抽象类

 public interface ISubject
    {

        void ChangOrderState(string title);
    }

产品实现类:

public class ConcreteSubject : ISubject
    {

        /// <summary>
        /// 观察者列表
        /// </summary>
        public List<IObserver> ObjectList = null;
        /// <summary>
        /// 生成实体subject的时候就会生成观察者列表
        /// </summary>
        /// <param name="objects"></param>
        public ConcreteSubject(List<IObserver> objects)
        {
            this.ObjectList = objects;
        }

        /// <summary>
        /// 订单状态发生改变
        /// </summary>
        /// <param name="title"></param>
        public void ChangOrderState(string title)
        {
            Console.WriteLine(title);
            SendSmsNotify();
        }

        /// <summary>
        /// 将消息通知观察者
        /// </summary>
        public void SendSmsNotify()
        {
            ObjectList.ForEach(x => { x.ReceptSubjctMessage(); });
        }


        static void Main(string[] arge)
        {
            List<IObserver> observerList = new List<IObserver>()
           {
               new SmsNotifyToCustomer(),
               new SmsNotifyToProdctAdmintrator()
           };
            ISubject subject = new ConcreteSubject(observerList);
            subject.ChangOrderState("产品状态变化了啊;我要发送购买短信给顾客,也要发送售卖成功短信给产品管理员啦");
            Console.ReadLine();
        }

    }

短信通知抽象类:

 public interface  IObserver
    {

        void ReceptSubjctMessage();
    }

短信通知顾客类

public  class  SmsNotifyToCustomer:IObserver
    {
        public void ReceptSubjctMessage()
        {
            Console.WriteLine("短信通知顾客购买成功提示");
        }
    }

短信通知产品管理员类:

 public  class SmsNotifyToProdctAdmintrator : IObserver
    {
        public void ReceptSubjctMessage()
        {
            Console.WriteLine($"恭喜您,您的产品售卖成功");
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值