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# 委托和事件 与 观察者模式(发布-订阅模式)讲解 by天命
扎实基础_设计模式_行为型_观察者模式(项目实战,使用委托注册事情,消除多重判断)