转-观察模式 猫叫鼠跑人醒

猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。

  public interface Observer
    {
        void Response();    //观察者的响应,如是老鼠见到猫的反映
    }
    public interface Subject
    {
        void AimAt(Observer obs);  //针对哪些观察者,这里指猫的要扑捉的对象---老鼠
    }
    public class Mouse : Observer
    {
        private string name;
        public Mouse(string name, Subject subj)
        {          
            this.name = name;
            subj.AimAt(this);
        }
       
        public void Response()
        {
            Console.WriteLine(name + " attempt to escape!");
        }
    }
    public class Master : Observer
    {  
        public Master(Subject subj)
        {          
            subj.AimAt(this);
        }
       
        public void Response()
        {
            Console.WriteLine("Host waken!");
        } 
    }

public class Cat : Subject
    {
        private ArrayList observers;
        public Cat()
        {  
            this.observers = new ArrayList();
        }
        public void AimAt(Observer obs)
        {
            this.observers.Add(obs);
        }
        public void Cry()
        {
            Console.WriteLine("Cat cryed!");
            foreach (Observer obs in this.observers)
            {
                obs.Response();
            }
        }
    }
    class MainClass
    {      
        static void Main(string[] args)
        {
            Cat cat = new Cat();
            Mouse mouse1 = new Mouse("mouse1", cat);
            Mouse mouse2 = new Mouse("mouse2", cat);
            Master master = new Master(cat);
            cat.Cry();
        }
    }

设计方法二: 使用event -- delegate设计..
public delegate void SubEventHandler();
    public abstract class Subject
    {
        public event SubEventHandler 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 SubEventHandler(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 + " attempt to escape!");
        }
    }
    public class Master : Observer
    {
        public Master(Subject sub) : base(sub){}
        public override void Response()
        {
            Console.WriteLine("host waken");
        }
    }
    class Class1
    {
        static void Main(string[] args)
        {
            Cat cat = new Cat();
            Mouse mouse1 = new Mouse("mouse1", cat);
            Mouse mouse2 = new Mouse("mouse2", cat);
            Master master = new Master(cat);
            cat.Cry();
        }
    }

时间: 2024-10-21 05:20:21

转-观察模式 猫叫鼠跑人醒的相关文章

观察者模式:猫叫鼠跑人醒(C#)

本着菜鸟先飞的想法,决定把平时遇到的知识点记录下来,一来是加深理解,二来是方便以后自己查阅.当您看到我这篇文章的时候,觉得代码有哪里不足的地方,请多指教,谢谢.(命名不规范是为了加深自己的理解,多多见谅.) 观察者模式:即当目标对象状态或者是行为发生改变时,正在观察该目标对象的观察者们做出一系列自动反应. 1.接口实现 public interface Oberver { void 坐出反应(); } public interface BObserver { void 反应(Oberver o)

委托/事件:猫叫鼠跑人醒

using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace CatCryRatRunMasterWake{ /// <summary> /// define a delegate /// </summary> public delegate void CatCryEventHandle(); class Program { static void Main(

醉汉拦车伤人 醒后完全没印象自称“断了片”

17日夜,在张村夜市,魏某酒后无故拦车,遭质问后拿起板砖伤人.因寻衅滋事,魏某被行政拘留7日,赔偿受伤司机的医疗费. 17日晚,魏某和两名朋友在张村夜市烧烤摊聚餐.吃完饭结账后,魏某独自一人跑到路边逼停一车.司机下车质问,魏某二话不说,捡起一块板砖,拍向司机头部,致使对方当场受伤流血. 当时,双岛边防派出所民警正在街面巡逻,立即控制网络pos机住魏某,并将受伤男子送医,司机头部缝了三针.随后,民警把魏某带至派出所,约束至酒醒.次日,魏某酒醒,对头一天晚上发生的事情完全没了印象,自称“断了片”.他

.net学习之委托和事件

1.什么是委托通俗的说:委托就是一个能够存储符合某种格式(方法签名)的方法的指针的容器上传图片: 2.委托语法准备一个方法:string Hello(string userName){} string Hello2(string userName){}声明委托类:delegate string DGSayHi(string userName);创建委托对象:DGSayHi dgSay = new DGSayHi(Hello); 或 DGSsyHi dgSay = Hello;追加方法:dgSay

(转).net学习之委托和事件

.net学习之委托和事件 1.什么是委托 通俗的说:委托就是一个能够存储符合某种格式(方法签名)的方法的指针的容器 上传图片: 2.委托语法 准备一个方法:string Hello(string userName){}        string Hello2(string userName){} 声明委托类:delegate string DGSayHi(string userName); 创建委托对象:DGSayHi dgSay = new DGSayHi(Hello); 或 DGSsyHi

程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒

第一种解决方案用事件来解决:是多级的联动:即:猫叫->老鼠跑->人醒 1 public class Cat 2 { 3 public delegate void Crying(object sender,EventArgs e)://定义一个猫叫委托 4 public event Crying cry://定义猫叫事件 5 public void OnCry(EventArgs e) 6 { 7 if(cry!=null) 8 { 9 cry(this,e): 10 } 11 } 12 pub

C# 委托和事件 与 观察者模式(发布-订阅模式)讲解 by天命

使用面向对象的思想 用c#控制台代码模拟猫抓老鼠 我们先来分析一下猫抓老鼠的过程 1.猫叫了 2.所有老鼠听到叫声,知道是哪只猫来了 3.老鼠们逃跑,边逃边喊:"xx猫来了,快跑啊!我是老鼠xxx" 一  双向耦合的代码 首先需要一个猫类Cat 一个老鼠类Rat 和一个测试类Program 老鼠类的代码如下 //老鼠类 public class Rat { public string Name { get; set; } //老鼠的名字 public Cat MyCat { get;

一阶段项目 猫天下

<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>宠喵club</title> <style> /** { margin:0px; padding:0px; }*/ #top1 { width:100%; height:35px; /*border:1px solid black;*/ bord

java设计模式2-观察者模式

什么是观察者模式? 何谓观察者模式?观察者模式定义了对象之间的一对多依赖关系,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并且自动更新. 在这里,发生改变的对象称之为观察目标,而被通知的对象称之为观察者.一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,所以么可以根据需要增加和删除观察者,使得系统更易于扩展. 观察者模式又称为发布-订阅模式 观察者模式的优点? 1,很好的解决了一对多的依赖关系中的藕合问题,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自