Unity实现设计模式——观察者模式
观察者设计模式定义了对象间的一种一对多的组合关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。
简单来说就是某个人需要收到通知只需要订阅这个通知,当通知发送时会发送到每个订阅此通知的人。
下面用股票变化去通知订阅此股票的人
1.IInvestor(‘Observer’ interface)
投资人接口
interface IInvestor{void Update(Stock stock);}
2.Investor(‘ConcreteObserver’ class)
投资人具体实现
class Investor : IInvestor{private string _name;private Stock _stock;// Constructorpublic Investor(string name){this._name = name;}public void Update(Stock stock){//Debug.Log("Notified {0} of {1}'s " +"change to {2:C}", _name, stock.Symbol, stock.Price);Debug.Log("Notified "+ _name+" of "+ stock+"'s " + "change to "+stock.Price);}// Gets or sets the stockpublic Stock Stock{get { return _stock; }set { _stock = value; }}}
3.Stock(The ‘Subject’ abstract class)
股票基类
abstract class Stock{private string _symbol;private double _price;private List<IInvestor> _investors = new List<IInvestor>();// Constructorpublic Stock(string symbol, double price){this._symbol = symbol;this._price = price;}public void Attach(IInvestor investor){_investors.Add(investor);}public void Detach(IInvestor investor){_investors.Remove(investor);}public void Notify(){foreach (IInvestor investor in _investors){investor.Update(this);}Debug.Log("Stock Notify( ) called");}// Gets or sets the pricepublic double Price{get { return _price; }set{if (_price != value){_price = value;Notify();}}}// Gets the symbolpublic string Symbol{get { return _symbol; }}}
4.IBM(‘ConcreteSubject’ class)
‘IBM’这只股票
class IBM : Stock{// Constructorpublic IBM(string symbol, double price): base(symbol, price){}}
5.测试
public class ObserverExample1 : MonoBehaviour{void Start(){// Create IBM stock and attach investorsIBM ibm = new IBM("IBM", 120.00);ibm.Attach(new Investor("Sorros"));ibm.Attach(new Investor("Berkshire"));// Fluctuating prices will notify investorsibm.Price = 120.10;ibm.Price = 121.00;ibm.Price = 120.50;ibm.Price = 120.75;}}