• Unity实现设计模式——观察者模式


    Unity实现设计模式——观察者模式

    观察者设计模式定义了对象间的一种一对多的组合关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。
    简单来说就是某个人需要收到通知只需要订阅这个通知,当通知发送时会发送到每个订阅此通知的人。
    在这里插入图片描述
    下面用股票变化去通知订阅此股票的人

    1.IInvestor(‘Observer’ interface)

    投资人接口

        interface IInvestor
        {
            void Update(Stock stock);
        }
    
    • 1
    • 2
    • 3
    • 4

    2.Investor(‘ConcreteObserver’ class)

    投资人具体实现

        class Investor : IInvestor
        {
            private string _name;
            private Stock _stock;
    
            // Constructor
            public 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 stock
            public Stock Stock
            {
                get { return _stock; }
                set { _stock = value; }
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    3.Stock(The ‘Subject’ abstract class)

    股票基类

    abstract class Stock
        {
            private string _symbol;
            private double _price;
            private List<IInvestor> _investors = new List<IInvestor>();
    
            // Constructor
            public 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 price
            public double Price
            {
                get { return _price; }
                set
                {
                    if (_price != value)
                    {
                        _price = value;
                        Notify();
                    }
                }
            }
    
            // Gets the symbol
            public string Symbol
            {
                get { return _symbol; }
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    4.IBM(‘ConcreteSubject’ class)

    ‘IBM’这只股票

        class IBM : Stock
        {
            // Constructor
            public IBM(string symbol, double price)
              : base(symbol, price)
            {
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    5.测试

        public class ObserverExample1 : MonoBehaviour
        {
            void Start()
            {
                // Create IBM stock and attach investors
                IBM ibm = new IBM("IBM", 120.00);
                ibm.Attach(new Investor("Sorros"));
                ibm.Attach(new Investor("Berkshire"));
    
                // Fluctuating prices will notify investors
                ibm.Price = 120.10;
                ibm.Price = 121.00;
                ibm.Price = 120.50;
                ibm.Price = 120.75;
    
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    【深圳五兴科技】Java后端面经
    postgresql源码学习(41)—— 崩溃恢复③ - 日志来源
    txt和jpg或png数据的自动化导入和自动化生成输出随用随拿
    vue开始日期与结束日期分开选择,结束日期禁用开始选中日期
    虾皮二面:既然有 HTTP 协议,为什么还要有 RPC?
    【Linux】VM及WindowsServer安装
    TOREX | 单功能充电IC的外置电流通路电路
    t2017递推3骨牌
    python open file way
    树套树P3380
  • 原文地址:https://blog.csdn.net/zzzsss123333/article/details/133340595