学习篇:设计模式-观察者模式

       观察者模式定义了对象间的一种一对多依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。它将观察者和被观察者的对象分离开。提高了应用程序的可维护性和重用性。观察者模式又称为发布/订阅(Publish/Subscribe)模式。
       使用场景
1、对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
2、 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。
下面用观察者模式实现一个简单的Demo:

一:创建 Subject 类
public class Subject
   {
       //声明一个订阅集合
       public readonly List<Observer> observers = new List<Observer>();

       private int state;
       public int GetState()
       {
           return state;
       }

       public void SetState(int state)
       {
           this.state = state;
           //更改完状态后立即通知所有的订阅者
           NotifyAllObservers();
       }

       public void Attach(Observer observer)
       {
           observers.Add(observer);
       }

       public void NotifyAllObservers()
       {
           foreach (var observer in observers)
           {
               observer.Update();
           }
       }
   }
}
二:创建观察者抽象类
     public abstract class Observer
   {
       protected Subject subject;
       public abstract void Subscribe(Subject subject);
       public abstract void Update();
   }
三:创建观察者具体类,当目标对象改变状态时,依赖对象的状态随之改变
 //订阅者1
 public class DoubleObserver : Observer
  {
      public static DoubleObserver Instance { get; } = new DoubleObserver();
      private DoubleObserver() { }
      public override void Subscribe(Subject subject)
      {
          this.subject = subject;
          this.subject.Attach(this);
      }
      public override void Update()
      {
          Console.WriteLine("双倍:"+ subject.GetState() * 2);
      }
  }
//订阅者2
class SquareObserver:Observer
  {
      public static SquareObserver Instance { get; } = new SquareObserver();
      private SquareObserver() { }
      public override void Subscribe(Subject subject)
      {
          this.subject = subject;
          this.subject.Attach(this);
      }
      public override void Update()
      {
          Console.WriteLine("平方:"+Math.Pow(subject.GetState(), 2));
      }
  }
  //订阅者3,4,5,6....
四:主方法执行
  class ObserverPatternDemo
    {
        static void Main(string[] args)
        {
            Subject subject = new Subject();
            
            //订阅消息
            DoubleObserver.Instance.Subscribe(subject);
            SqrtObserver.Instance.Subscribe(subject);
            SquareObserver.Instance.Subscribe(subject);
            //......
            
            subject.SetState(16);
        }
    }
五:执行程序,输出结果:
双倍:32
平方根:4
平方:256
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值