首页 > 其他 > 详细

关于观察着设计模式的两种实现方式

时间:2017-07-13 00:04:07      阅读:256      评论:0      收藏:0      [点我收藏+]

观察着设计模式

 

经典案例:猫叫了,惊动老鼠 和 主人;

第一种利用面向对象的实现方式,分别使用接口和对接口的实现,也就是多肽的特性来进行拓展;

  public interface Observer
    {
        void Response();  //观察者的响应,如是老鼠见到猫的反映 
    }

    public interface Subject
    {
        void Aimed(Observer obs); //针对哪些观察者
    }


    public class Mouse : Observer
    {
        private string name;
        public Mouse(string name, Subject sub)
        {
            this.name = name;
            sub.Aimed(this);
        }
        public void Response()
        {
            Console.WriteLine(name+"attemp to escaped");
        }
    }

    public class Master : Observer
    {
        public Master(Subject sub)
        {
            sub.Aimed(this);
        }

        public void Response()
        {
            Console.WriteLine("host waked");
        }
    }

    public class Cat : Subject
    {
        private ArrayList objservers;

        public Cat()
        {
            this.objservers = new ArrayList();
        }
        public void Aimed(Observer ob)
        {
            this.objservers.Add(ob);
        }

        public void Cry()
        {
            Console.WriteLine("Cat Cryed");

            foreach (Observer o in this.objservers)
            {
                o.Response();  //接口的好处 ,面向我们的接口编程,具体的实现,交给我们的实际的实现类的方法滴哎呦;
            }

        }

    }

    public class Test
    {
        static void fuck()
        {
            Cat cat = new Cat();
            Mouse m = new Mouse("nouse1",cat);
            Mouse m2 = new Mouse("nouse2", cat);
            Master ma = new Master(cat);
            cat.Cry();


        }
    }

总之是感觉非常秒的代码滴呀;效果是非常好滴呀;

 

第二种模式是使用我们委托和事件的特性来进行拓展;

这种方式里面也包含了面向对象的特性滴呀;

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication4
{


    //这里是对应的我们的第二种实现的方式;

    public delegate void SubEventHanlder();

    public abstract class Subject
    {
        public event SubEventHanlder subEvent;
        protected void FireAway()
        {
            if (this.subEvent != null)
                this.subEvent();
        }
    }


    public class Cat : Subject
    {
        public void Cry()
        {
            Console.WriteLine("cat cryed");
            this.FireAway();
        }
    }

    public abstract class Observer
    {
        public Observer(Subject sub)
        {
            sub.subEvent += new SubEventHanlder(Response);
        }

        public abstract void Response();
    }

    public class Mouse : Observer
    {
        private string name;
        public Mouse(string name, Subject sub)
            : base(sub)
        {
            this.name = name;
        }

        public override void Response()
        {
            Console.WriteLine(name + "attemp to  escape!");
        }

    }

    public class Master : Observer
    {
        public Master(Subject sub)
            : base(sub)
        {

        }

        public override void Response()
        {
            Console.WriteLine("host waked");
        }

    }


    public class Test
    {
        public void t()
        {
            Cat c = new Cat();
            Mouse m1 = new Mouse("m1", c);
            Mouse m2 = new Mouse("m2", c);
            Master m = new Master(c);
            c.Cry();
        }
    }


}

后面我们再看看以前,一篇关于烧开水的 观察模式额实例

 

那个实例也是比较经典滴呀;效果非常好滴呀;

 

关于观察着设计模式的两种实现方式

原文:http://www.cnblogs.com/mc67/p/7158205.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!