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

观察着设计模式

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

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

  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();
        }
    }

}

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

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

时间: 2024-10-14 08:12:08

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

JAVABEAN是什么和总结JAVABEAN的两种使用方式

看完这个后再也不纠结javabean是什么东西了,感谢博主,由于是Javablog不能收藏故在此转发. 以下内容转自:http://www.blogjava.net/flysky19/articles/88180.html 一. javabean 是什么? Javabean 就是一个类,这个类就定义一系列 get<Name> 和 set<Name> 方法. So simple ! Javabean 就是为了和 jsp 页面传数据化简交互过程而产生的. 自己的理解: 使用 javab

Web API之认证(Authentication)两种实现方式【二】(十三)

前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再废叙述废话. 序言 对于所谓的认证说到底就是安全问题,在Web API中有多种方式来实现安全,[accepted]方式来处理基于IIS的安全(通过上节提到的WindowsIdentity依赖于HttpContext和IIS认证)或者在Web API里通过使用Web API中的消息处理机制,但是如果我们想应用程序运行在IIS之外此时Win

二、C++迭代器的两种实现方式 (Range for和C#、Java中的foreach)

一.迭代器概述 这个标题其实有点"标题党"的含义,因为C++在标准库中的实现迭代器的方式只有一种,也就是为类定义begin()和end()函数,C++11增加了range for语句,可以用来遍历迭代器中的元素.实现迭代器的第二种方式,就是用C++模拟C#和Java中的迭代器模式,并且我们可以定义出自己的foreach语句.除此之外,迭代器可能还有很多种实现的方法,各个库也会多自己的迭代器的实现有所定义,在这里只要明白迭代器的本质意义即可. 迭代器,也称作游标,是一种设计模式,我们可以

多线程两种实现方式的区别

请解释Thread类与Runnable接口实现多线程的区别?(请解释多线程两种实现方式的区别?) 1. Thread类时Runnable接口的子类,使用Runnable接口实现多线程可以避免单继承局限!2. Runnable接口实现的多线程可以比Thread类实现的多线程更加清楚的描述数据共享的概念! 请写出多线程两种实现操作?(写出Thread类继承的方式和Runnable接口实现的方式代码!) 实现Thread类: 类似于代理设计模式! class MyThread extends Thre

[转]Web APi之认证(Authentication)两种实现方式【二】(十三)

本文转自:http://www.cnblogs.com/CreateMyself/p/4857799.html 前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再叙述废话. 序言 对于所谓的认证说到底就是安全问题,在Web API中有多种方式来实现安全,[accepted]方式来处理基于IIS的安全(通过上节提到的WindowsIdentity依赖于HttpContext和IIS认证)

codevs 2216 线段树 两种更新方式的冲突

题目描述 Description “神州“载人飞船的发射成功让小可可非常激动,他立志长大后要成为一名宇航员假期一始,他就报名参加了“小小宇航员夏令营”,在这里小可可不仅学到了丰富的宇航知识,还参与解决了一些模拟飞行中发现的问题,今天指导老师交给他一个任务,在这次模拟飞行的路线上有N个行星,暂且称它们为一个行星序列,并将他们从1至n标号,在宇宙未知力量的作用下这N个行星的质量是不断变化的,所以他们对飞船产生的引力也会不断变化,小可可的任务就是在飞行途中计算这个行星序列中某段行星的质量和,以便能及时

RabbitMQ学习第二记:工作队列的两种分发方式,轮询分发(Round-robin)和 公平分发(Fair dispatch)

1.什么是RabbitMQ工作队列 我们在应用程序使用消息系统时,一般情况下生产者往队列里插入数据时速度是比较快的,但是消费者消费数据往往涉及到一些业务逻辑处理导致速度跟不上生产者生产数据.因此如果一个生产者对应一个消费者的话,很容易导致很多消息堆积在队列里.这时,就得使用工作队列了.一个队列有多个消费者同时消费数据. 下图取自于官方网站(RabbitMQ)的工作队列的图例 P:消息的生产者 C1:消息的消费者1 C2:消息的消费者2 红色:队列 生产者将消息发送到队列,多个消费者同时从队列中获

PlaceHolder的两种实现方式

placeholder属性是HTML5 中为input添加的.在input上提供一个占位符,文字形式展示输入字段预期值的提示信息(hint),该字段会在输入为空时显示. 如 1 <input type="text" name="loginName" placeholder="邮箱/手机号/QQ号"> 目前浏览器的支持情况 浏览器 IE6/7/8/9 IE10+ Firefox Chrome Safari  是否支持 NO YES YE

简易版聊天系统实现 Socket VS NIO两种实现方式

说是简单聊天系统,压根不能算是一个系统,顶多算个雏形.本文重点不在聊天系统设计和实现上,而是通过实现类似效果,展示下NIO 和Socket两种编程方式的差异性.说是Socket与NIO的编程方式,不太严谨,因为NIO的底层也是通过Socket实现的,但又想不出非常好的题目,就这样吧. 主要内容 Socket方式实现简易聊天效果 NIO方式实现简易聊天效果 两种方式的性能对比 前言 预期效果,是客户端之间进行"广播"式聊天,类似于QQ群聊天.希望以后有机会,以此简易版为基础,不断演进,演