Skip to content

Latest commit

 

History

History
219 lines (129 loc) · 4.54 KB

12-行为型-观察者模式.md

File metadata and controls

219 lines (129 loc) · 4.54 KB
layout title date updated tags categories permalink thumbnail toc comment notag top
12-行为型-观察者模式
2016-10-17
2016-10-17
设计模式
UML与设计模式
设计模式
true
true
false
false

12-行为型-观察者模式

12.1 观察者模式引入-股票价格监控软件的设计

  • 监控某一个公司的股票价格变化,可以有多种方式,通知的对象可以是投资者,或者是发送到移动设备,还有电子邮件等。
public class Microsoft{
    private Investor _investor;
    private String _symbol;
    private Mobile _mobile;
    private double _price;

    public void Update()    {
        _investor.SendData(this);
        _mobile.SendData(this);

    }

    public Investor Investor{getter;setter;}
    public String Symbol{getter;setter; }
    public double Price {getter;setter;}
}

public class Investor{
    private string _name;
    public Investor(string name)    {
        this._name = name;
    }

    public void SendData(Microsoft  ms){
        Console.WriteLine("Notified {0} of {1}'s " + "change to {2:C}", _name, ms.Symbol,ms.Price);
    }
}

  • Microsoft和Investor之间形成了一种双向的依赖关系,即Microsoft调用了Investor的方法,而Investor调用了Microsoft类的属性。如果有其中一个类变化,有可能会引起另一个的变化。

12.2 使用观察者模式

public abstract class Stock{
private List<IObserver> observers = new List<IObserver>();
    public void Update(){
        foreach (IObserver ob in observers) {
            ob.SendData(this);
        }
    }
    public void AddObserver(IObserver observer){…}
    public void RemoveObserver(IObserver observer){…}
}

public class Microsoft:Stock{
    private String _symbol;
    private double _price;
}
public class Google:Stock{
    private String _symbol;
    private double _price;
}


public interface IObserver{
    void SendData(Stock stock);
}


public class Investor: IObserver {
    private string _name;
    public Investor(string name)    {
        this._name = name;
    }

    public void SendData(Microsoft  ms){
        Console.WriteLine("Notified {0} of {1}'s " + "change to {2:C}", _name, ms.Symbol,ms.Price);
    }
}

public class Mobile: IObserver {
    private string _no;
    public Mobile(string No) {
        this._no = No;
    }

    public void SendData(Stock ms){
        Console.WriteLine("Notified {0} of {1}'s " + "change to {2:C}", _no, ms.Symbol, ms.Price);
    }
}

class Program
{
    static void Main(string[] args)
    {
        Stock ms = new Microsoft("Microsoft",120.00);

        ms.AddObserver(new Investor("Jom"));

        ms.AddObserver(new Mobile("TerryLee"));

        ms.Update();

    }

}

image

12.3 观察者模式定义

  • 观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。观察者模式是一种对象行为型模式。

12.4 观察者模式结构

  • 观察者模式包含以下4个角色:
    1. Subject(目标)
    2. ConcreteSubject(具体目标)
    3. Observer(观察者)
    4. ConcreteObserver(具体观察者) image
  • 定义了对象之间一种一对多的依赖关系,让一个对象的改变能够影响其他对象
  • 发生改变的对象称为观察目标,被通知的对象称为观察者
  • 一个观察目标可以对应多个观察者

12.5 观察者模式优缺点

  • 模式优点
    1. 可以用来实现表示层和数据逻辑层的分离
    2. 在观察目标和观察者之间建立一个抽象的耦合
    3. 支持广播通信,简化了一对多系统设计的难度
    4. 符合开闭原则,增加新的具体观察者无须修改原有系统代码,在具体观察者与观察目标之间不存在关联关系的情况下,增加新的观察目标也很方便 模式缺点
    • 将所有的观察者都通知到可能会花费很多时间
    • 如果存在循环依赖时可能导致系统崩溃
    • 单纯的观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而只是知道观察目标发生了变化