zoukankan      html  css  js  c++  java
  • 设计模式

    /// <summary>
    /// 抽象观察者接口
    /// </summary>
    interface Observer
    {         
        void Update();
    }
    
    /// <summary>
    /// 具体观察者
    /// </summary>
    class ConcreteObserver : Observer
    {
        string _name;
        string _observerState;
        ConcreteSubject _subject;
        public ConcreteSubject Subject
        {
            get { return _subject; }
            set { _subject = value; }
        }
        public ConcreteObserver(ConcreteSubject sub, string name)
        {
            this._subject = sub;
            this._name = name;
        }
    
        public void Update()
        {
            _observerState = Subject.SubjectState;
            Console.WriteLine(string.Format("通知{0}:{1}, no stock", _name, _observerState));
        }
    }
     
    
    /// <summary>
    /// 抽象发布类
    /// </summary>
    abstract class Subject
    {
        private IList<Observer> observers = new List<Observer>();
        public void Attach(Observer ob)
        {
            observers.Add(ob);
        }
    
        public void Detach(Observer ob)
        {
            observers.Remove(ob);
        }
    
        public void Notify()
        {
            foreach (Observer ob in observers)
            {
                ob.Update();
            }
        }                
    }
    
    /// <summary>
    /// 具体发布类
    /// </summary>
    class ConcreteSubject : Subject
    {
        string subjectState;
        public string SubjectState
        {
            get { return subjectState; }
            set { subjectState = value; }
        }
    }
    
    
    // 业务代码
    ConcreteSubject sub = new ConcreteSubject();
    sub.Attach(new ConcreteObserver(sub, "x"));
    sub.Attach(new ConcreteObserver(sub, "y"));
    
    sub.SubjectState = "ABC";
    sub.Notify();   
    

    但是并不是每个观察者都会有 Update 这个方法,因此:

    /// <summary>
    /// 具体观察者
    /// </summary>
    class ConcreteObserver
    {
        string _name;
        Subject _sub;
        public ConcreteObserver(string name, Subject sub)
        {
            this._name = name;
            this._sub = sub;
        }
    
        public void Closing()
        {
            Console.WriteLine(string.Format("通知{0}:{1} : Close, no stock", _name, _sub.SubjectState));
        }
    
        public void Open()
        {
            Console.WriteLine(string.Format("通知{0}:{1} : Open, no stock", _name, _sub.SubjectState));
        }
    }
        
    /// <summary>
    /// 抽象发布类
    /// </summary>
    interface Subject
    {
        void Notify();
        string SubjectState
        {
            get;
            set;
        }
    }
    
    delegate void EventHandler();
    
    class Boss : Subject
    {
        string action;
        public string SubjectState
        {
            get { return action; }
            set { action = value; }
        }               
            
        public event EventHandler Update;
    
        public void Notify()
        {
            Update();
        }
    }
    
            
    // 业务代码        
    Boss hu = new Boss();
    
    ConcreteObserver ob1 = new ConcreteObserver("boyA", hu);
    ConcreteObserver ob2 = new ConcreteObserver("boyB", hu);
    
    hu.Update += new EventHandler(ob1.Closing);
    hu.Update += new EventHandler(ob2.Open);
    
    hu.SubjectState = "I am Coming";
    
    hu.Notify();
    
  • 相关阅读:
    Error: unable to connect to node rabbit@mail: nodedown
    flash上传控件跨域
    Nginx配置指定媒体类型文件强制下载
    Nginx反向代理配置可跨域
    日志:using the Connector/J connection property 'autoReconnect=true' to avoid this problem
    web 安全(一)--web简介及 前端技术(js)
    Android 自动化之元素定位 xpath
    Wireshark入门
    自动化测试工具
    Android App 专项测试--压力测试篇(三)
  • 原文地址:https://www.cnblogs.com/MichaelLoveSna/p/14198948.html
Copyright © 2011-2022 走看看