zoukankan      html  css  js  c++  java
  • 观察者模式 学习记录(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();
    }

  • 相关阅读:
    Fragment传参
    android手机旋转方向识别
    如何激活已经运行过的Activity, 而不是重新启动新的Activity
    Android 在Canvas中实现画笔效果(一)--钢笔
    [AS3]as3画笔实例实现橡皮擦功能源代码
    在 Windows 環境下利用 VNC 遠端控管 Mac OS X Server
    mac下开发IOS代码管理
    Android开发--仿微信语音对讲录音
    Android 二维码 生成和识别(附Demo源码)
    Android开源项目分类汇总
  • 原文地址:https://www.cnblogs.com/swordtm/p/5977022.html
Copyright © 2011-2022 走看看