c#设计模式-行为性模式-2.观察者模式

Posted mr.chenyuelin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#设计模式-行为性模式-2.观察者模式相关的知识,希望对你有一定的参考价值。

观察者模式

是一种通知依赖关系,一个对象的状态发生改变,所有依赖的对象(观察者)都将得到通知并自动更新

优点:
1.观察者模式实现了表示层与逻辑层的分离
2.观察者与被观察者之间建立一个抽象的耦合,被观察者不知道任何一个具体的观察者,只是保存在列表中
3.支持广播通信

缺点:
1.当被观察者有很多观察者时,通知所有观察者会很浪费时间,当然可以筛选
2.观察者模式不知道观察的对象是怎样发生变化的
3.被观察者有循环依赖的话,被观察者会1触发它们进行循环调用

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

namespace 观察者
{
    //银行抽象系统接口,属于被观察者
    public abstract class BankMassageSystem
    {
        protected List<Depositor> observes;

        protected BankMassageSystem()
        {
            observes = new List<Depositor>();
        }

        public abstract void Add(Depositor depositor);

        public abstract void Delete(Depositor depositor);
        //通知储户
        public void Notice()
        {
            //Console.WriteLine(observes.Count);
            foreach(Depositor depositor in observes)
            {
                //储户发生变化时,更新储户信息
                if(depositor.AccountIsChanged)
                {
                    depositor.Update(depositor.CurrentMoney, depositor.OperationDateTime);
                    depositor.AccountIsChanged = false;
                }
            }
        }
    }
    //银行短信系统,属于被观察者
    public sealed class fujianBankMassageSystem : BankMassageSystem
    {
        public override void Add(Depositor depositor)
        {
            //没有观察者则增加
            if(!observes.Contains(depositor))
            {
                observes.Add(depositor);
            }          
        }

        public override void Delete(Depositor depositor)
        {
            //已有观察者则移除
            if (observes.Contains(depositor))
                observes.Remove(depositor);
        }
    }

    //储户抽象接口,相当于抽象观察者(observes)
    public abstract class Depositor
    {
        private string name;
        private int currentMoney;
        private bool isChanged;
        protected Depositor(string name,int total)
        {
            this.name = name;
            this.currentMoney = total;
            this.isChanged = false;//账号未发生变化
        }

        public string Name
        {
            get { return name; }
            private set
            {
                this.name = value;
            }
        }
        public int CurrentMoney
        {
            get { return this.currentMoney; }
        }
        //取钱
        public void GetMoney(int num)
        {
            if (num <= currentMoney && num >= 0)
            {
                currentMoney -= num;
                isChanged = true;
                OperationDateTime = DateTime.Now;
            }
        }
        //储户操作时间
        public DateTime OperationDateTime { get; set; }

        public bool AccountIsChanged
        {
            get { return isChanged; }
            set { isChanged = value; }
        }
        //更新储户状态
        public abstract void Update(int currentNum, DateTime dateTime);
    }
    //具体福建用户
    public sealed class FuJianDepositor : Depositor
    {
        public FuJianDepositor(string name,int total) : base(name, total) { }
        public override void Update(int currentNum, DateTime dateTime)
        {
            Console.WriteLine(Name+":账户发生了变化,变化时间是" + dateTime.ToString() + ",当前余额:" + currentNum);
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            Depositor xiaohua = new FuJianDepositor("小华", 3000);
            Depositor xiaoming = new FuJianDepositor("小明", 2000);
            Depositor qingchen = new FuJianDepositor("轻尘", 300);

            BankMassageSystem fujianBank = new fujianBankMassageSystem();
            //用户订阅银行短信业务
            fujianBank.Add(xiaohua);
            fujianBank.Add(xiaoming);
            fujianBank.Add(qingchen);

            xiaohua.GetMoney(500);
            fujianBank.Notice();

            xiaoming.GetMoney(300);
            qingchen.GetMoney(200);
            fujianBank.Notice();

            Console.ReadKey();
        }
    }

}

小华:账户发生了变化,变化时间是2021/5/17 22:25:16,当前余额:2500
小明:账户发生了变化,变化时间是2021/5/17 22:25:16,当前余额:1700
轻尘:账户发生了变化,变化时间是2021/5/17 22:25:16,当前余额:100

以上是关于c#设计模式-行为性模式-2.观察者模式的主要内容,如果未能解决你的问题,请参考以下文章

c#设计模式-观察者模式

⭐️C#基础知识学习⭐️| 编程 设计模式界的”网红”——观察者模式

C# 委托和事件 与 观察者模式(发布-订阅模式)讲解 by天命

扎实基础_设计模式_行为型_观察者模式(项目实战,使用委托注册事情,消除多重判断)

扎实基础_设计模式_行为型_观察者模式(项目实战,使用委托注册事情,消除多重判断)

初探Java设计模式3:行为型模式(策略,观察者等)