• 设计模式:Observer模式 之 互为观察者与被观察者


    在现实世界中,没有单纯的观察者或者被观察者,大部分时候,一体两种角色兼备。

    一个小小的实验:

    Observer
    namespace woodigg.DesignMode
    {
        
    /// <summary>
        
    /// 通知对象
        
    /// </summary>
        public abstract class Human
        {
            
    /// <summary>
            
    /// 名字
            
    /// </summary>
            public string Name { getset; }
            
    /// <summary>
            
    /// Constructor
            
    /// </summary>
            public Human(string name){
                
    this.Name = name;
            }             
            
    /// <summary>
            
    /// 委托
            
    /// </summary>
            
    /// <param name="name"></param>
            public delegate void HumanEventHandler(string name);       
            
    public event HumanEventHandler HumanEvent;
            
    /// <summary>
            
    /// 通知
            
    /// </summary>
            public virtual void Notify() {
                
    if (HumanEvent != null)
                    HumanEvent(
    this.Name);
            } 
        }

        
    /// <summary>
        
    /// 观察者对象
        
    /// </summary>
        public abstract class Observer4Human : Human
        {
            
    /// <summary>
            
    /// 名字传递给基类
            
    /// </summary>
            
    /// <param name="name"></param>
            public Observer4Human(string name) : base(name) {}
            
    /// <summary>
            
    /// 通知回调方法
            
    /// </summary>
            
    /// <param name="name"></param>
            public abstract void Update(string name);
        }

        
    //--------------------- Concrete -------------------------//
        /// <summary>
        
    /// 丈夫
        
    /// </summary>
        public class Husband : Observer4Human 
        {
            
    public Husband(string name) : base(name) { }

            
    public override void Notify()
            {
                Console.WriteLine(
    this.Name + " 喝多了!");
                
    base.Notify();
            }

            
    public override void Update(string name)
            {
                Console.WriteLine(
    this.Name + " 看着 "+name+" 不再闹了!");
            }
        }
        
    /// <summary>
        
    /// 妻子
        
    /// </summary>
        public class Wife : Observer4Human {
            
    public Wife(string name) : base(name) { }

            
    public override void Update(string name)
            {
                Console.WriteLine(
    this.Name + " 被 "+name+" 吵醒了!");
                
    base.Notify();
            }
        }
        
    /// <summary>
        
    /// 孩子
        
    /// </summary>
        public class Baby : Observer4Human
        {
            
    public Baby(string name) : base(name) { }

            
    public override void Update(string name)
            {
                Console.WriteLine(
    this.Name + " 被 "+name+" 吓哭了!");
                
    base.Notify();
            }
        }
    }

    测试代码:

    代码
    [Test]
            
    public void HumanObserverTest()
            {
                
    //通知者
                Husband husband = new Husband("Johnny");

                Observer4Human wife 
    = new Wife("Have");
                Observer4Human babe 
    = new Baby("kitt");

                husband.HumanEvent 
    +=new Human.HumanEventHandler(wife.Update);
                wife.HumanEvent 
    += new Human.HumanEventHandler(babe.Update);
                babe.HumanEvent 
    += new Human.HumanEventHandler(husband.Update);

                husband.Notify();
            }

    NUnit结果:

     ***** woodigg.DesignMode.ObserverTest.AbstractObserverTest.HumanObserverTest
    Johnny 喝多了!
    Have 被 Johnny 吵醒了!
    kitt 被 Have 吓哭了!
    Johnny 看着 kitt 不再闹了!
    Creative Commons License
    本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 Unported许可协议
    欢迎转载,但必须保留文章的署名老莫的帐本子
    并保留此链接:http://moye.cnblogs.com/
    如有疑问请发邮件:moyerock@gmail.com
  • 相关阅读:
    Maven pom.xml中添加指定的中央仓库
    命令行远程链接MySQL
    A required class was missing while executing org.apache.maven.plugins:maven-war-plugin:2.1.1:war
    mvn deploy命令上传包
    保存好你的密码
    PuTTY免输密码自动登录Linux
    ActiveMQ无法启动
    linux控制台批量杀进程
    dubbo入门之微服务客户端服务端配置
    dubbo入门之helloWorld
  • 原文地址:https://www.cnblogs.com/moye/p/1645041.html
Copyright © 2020-2023  润新知