• 观察者模式 学习记录(1/2 略难看)


    观察者模式

    观察者模式 又叫 发布-订阅模式(Publish/Subsribe)

    1.Subject类
    //抽象类 里面有一个Observer类集合
    把所有对观察者对象的引用保存在一个聚集里,每个主题都可以有多个观察者.抽象主题提供一个接口,可以增加和删除观察着对象

    2.Observer类
    //抽象类
    抽象观察者,为所有的具体观察者定义一个接口,在得到主题的更新时提醒自己

    3.ConcreteObserver类
    //父类是Observer类
    具体观察者,实现抽象观察者角色所需求的更新接口,以便使本身的状态与主题的状态相协调

    4.ConcreteSubject类
    //父类是Subject
    具体主题,将有关状态存入具体观察者对象,在具体主题的内部状态改变时,给所有登记过的观察者发出通知

    //Subject类 主题/抽象通知者
    abstract class Subject{
    private List<Observer> ob=new List<Observer>();
    //增加观察者
    public void Attach(Observer o){
    ob.Add(o);
    }
    //通知
    public void Notify(){
    foreach(Observer o in ob){
    o.Update();
    }
    }
    }

    //Observer类 抽象观察者
    abstract class Observer{
    public abstract void Update();
    }

    //ConcreteObserver类 具体主题或者具体通知者
    class ConcreteSubject:Subject{
    prop string SubjectState{get; set;}
    //具体被观察者状态
    }

    //ConcreteObserver类,具体观察者,实现抽象观察者所需求的更新接口,以便使本身的状态与主体的状态相协调.可以保存一个指向具体对象的引用
    class ConcreteObserver:Observer{
    private string name;
    private string observerState;
    private ConcreteSubject subject;

    public ConcreteObserver(ConcreteSubject subject,string name){
    this.subject=subject;
    this.name=name;
    }

    public override Update(){
    observerState=subject.SubjectState;
    Console.WriteLine("");
    }
    }


    //客户端代码
    static void Main(string[] args){
    ConcreteSubject s=new ConcreteSubject();
    s.Attach(new ConcreteObserver(s,"A"));
    s.Attach(new ConcreteObserver(s,"B"));
    s.SubjectState="aaa";
    s.Notify();
    }


    5.观察者模式的特点

    将一个系统分割成一系列相互作用的类有一个很不好的副作用,就是需要维护相关对象间的一致性,使得各个类紧密耦合,这样会给维护,扩展和重用都带来不便

    1.一个主题可以有任意数量依赖他的观察者,一旦主题的状态发生改变,所有观察者都可以得到通知
    2.主题发出通知不需要知道具体观察者
    3.具体观察者也不需要知道其他观察者的存在

    /*
    当一个对象的改变需要同时改变其他对象的时候使用观察模式
    不知道具体有多少对象有待改变时,应考虑使用观察者模式
    一个抽象模型有两个方面,其中一个方面依赖于另一个方面
    */

    作用
    解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化

    interface Observer{
    void Update();
    }


    6.事件委托实现
    //声明一个委托 时间处理程序EventHandler
    delegate void EventHandler();

    //在Subject类里声明一个事件Update 类型为委托EventHandler
    public event EventHandler Update;
    //在访问通知方法时调用更新
    public void Notify(){
    Update();
    }

  • 相关阅读:
    v-charts 使用markline标线
    覆盖率平台(5)- 生成覆盖率报告
    覆盖率平台(4)- 测程启动
    覆盖率平台(3)- 测程
    覆盖率平台(2)- 服务配置
    vue路由this.route.push跳转页面不刷新
    递归对比json
    ssh远程执行遇到的一些坑
    免密git clone/git pull
    git用远程代码强制覆盖本地代码
  • 原文地址:https://www.cnblogs.com/swordtm/p/5977022.html
Copyright © 2020-2023  润新知