程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言)

简介:

要求:  1.要有联动性,老鼠和主人的行为是被动的。

     2.考虑可扩展性,猫的叫声可能引起其他联动效应。

我么能事件来一步一步来实现: 将要执行的老鼠逃跑,和主人惊醒的行为注册到事件中,猫叫之后引发事件的执行!

  1、声明一个委托

namespace ConsoleTest.MouseAndCat
{
    public delegate void Delegate();
}

  2、因为是由猫叫引发的事件执行,所有事件声明在猫类中

复制代码
namespace ConsoleTest.MouseAndCat
{
    public  class Cat
    {
        public event Delegate Eventhandler;
public void FireAway() { if (this.Eventhandler != null) { this.Eventhandler(); } } } }
复制代码

  3、下面写(老鼠,主人),对其类实例化时,将要执行的行为注册到事件中

复制代码
namespace ConsoleTest.MouseAndCat
{
    public class Master
    {
        public Master(Cat cat)
        {
            cat.Eventhandler += new Delegate(Action);
        }
        public void Action()
        {
            Console.WriteLine("主人听见了!");
        }
    }
    public class Mouse
    {
        public Mouse(Cat cat)
        {
            cat.Eventhandler += new Delegate(Action);
        }
        public void Action()
        {
            Console.WriteLine("老鼠听见了,逃跑!");
        }
    }
}
复制代码

  4、执行,执行cat的FireAwayAndWakeup方法,内部执行已注册到事件的方法

复制代码
        static void Main(string[] args)
        {
            Cat cat = new Cat();
            Mouse mouse = new Mouse(cat);
            Master master = new Master(cat);
            cat.FireAway();
        }
复制代码

 ---------------------------------------------------------------------------------------------

  提高一:以上已经实现了,但是考虑到可扩展性,再看第3部分的两个类中,都是在构造函数中注册事件,并且有一个执行的方法,那么如果再扩展其他的功能,比如,邻居听见...等。都需要再写相同的代码,所有我们有必要为观察者(猫叫之后,所引发的对象)提供一个父类或者接口,来统一标准,但是因为观察者都是在构造函数中进行事件的注册,而注册到事件中的方法所做的事件不同(例:老鼠逃跑、主人等),所以我们来创建一个父类(既有接口的功能,也有具体的事件),抽象类,又它来作为观察者的父类

复制代码
    public abstract class Observer
    {
        public Observer(Cat cat)
        { 
            cat.Eventhandler+=new Delegate(Action);
        }
        public abstract void Action();
    }
复制代码

  那么观察者的类中的也要有相应的变动

复制代码
 public class Master:Observer
    {
        public Master(Cat cat):base(cat) //执行父类中的构造函数,并且将此派生类中的方法在父类的构造函数中注册到事件中
        { }
        public override void Action()    //重写抽象类中的抽象方法
        {
            Console.WriteLine("主人听见了!");
        }
    }
    public class Mouse:Observer
    {
        public Mouse(Cat cat):base(cat) //执行父类中的构造函数,并且将此派生类中的方法在父类的构造函数中注册到事件中
        {}
        public override void Action()
        {
            Console.WriteLine("老鼠听见了,逃跑!");
        }
    }
复制代码

  这样一来,再对观察者进行相应的扩展的时候也就省去了些许的步骤,如果观察者多了的话,优点之处就会更加明显了。

----------------------------------------------------------------------------------------------------

  提高二:我们再对第2部分进行改进,这里是由 猫叫 引发的一系列的行为,但是如果我们之后又想添加 狗叫 引发这些行为的话,那么就需要再重写第2部分的那些代码,本着可扩展的目的,我们为这些引发行为的 引发者(猫、狗) 添加一个父类,父类中去实现引发事件的执行,而其派生类(阿猫、阿狗),只负责去调用其父类中的方法即可..

复制代码
    public abstract class Subject
    {
        public event Delegate Eventhandler;
        public void FireAway()
        {
            if (this.Eventhandler != null)
            {
                this.Eventhandler();
            }
        }
    }
复制代码

  那么 引发者 只需要调用父类中的FireAway方法去执行已注册在事件中的方法即可。

复制代码
 public  class Cat
    {
        public void Cry()
        {
            this.FireAway();
        }
    }
    public class Dog
    {
        public void Cry()
        {
            this.FireAway();
        }
    }
复制代码

  值得注意的是,观察者 的构造函数中的参数类型,要改为引发者的父类:Subject 。因为不止可以将引发的行为(老鼠逃跑、主人醒等)添加到猫引发的事件中,还可以将其添加到狗引发的事件中。

所以整个部分应该为:

  委托
  引发者
  观察者
  执行

OK...

 



本文转自武沛齐博客园博客,原文链接:http://www.cnblogs.com/wupeiqi/p/3155254.html,如需转载请自行联系原作者

目录
相关文章
|
C# C++
创建目标类型对象在C#7.3中不可用,请使用9.0或更高的语言版本
创建目标类型对象在C#7.3中不可用,请使用9.0或更高的语言版本
1105 0
创建目标类型对象在C#7.3中不可用,请使用9.0或更高的语言版本
|
1月前
|
数据挖掘 C# 开发工具
采用C#语言开发的全套医院体检系统PEIS源码功能介绍
体检系统,是专为体检中心/医院体检科等体检机构,专门开发的全流程管理系统,通过软件实现检测仪器数据自动提取,内置多级医生工作台,细化工作将体检检查结果汇总,生成体检报告登记到计算机系统中。通过软件系统进行数据分析统计与评判以及建立体检相关的体检档案。从而实现体检流程的信息化,提高工作效率,减少手动结果录入的一些常犯错误。 在实际应用中,医院体检系统能够解决传统体检中手工操作带来的问题,如工作量大、效率低下、易漏检、重检或错检等。通过与医院信息系统(如HIS、LIS、PACS等)的连接,系统能够满足体检中心的日常工作流程,提供更好的管理、统计和查询分析功能。同时,基于网络基础的系统可以在网上传输
27 1
|
4月前
|
C#
C# 高级语言的 “进制转换”
C# 高级语言的 “进制转换”
|
5月前
|
开发框架 JavaScript Java
推荐一个日历转换开源工具库,支持C#、Java、PHP等主流的语言
推荐一个日历转换开源工具库,支持C#、Java、PHP等主流的语言
42 0
|
6月前
|
安全 Java C#
C#语言基础知识
C#语言基础知识
|
9月前
|
JSON C# 数据格式
使用C#语言来进行json串的接收
使用C#语言来进行json串的接收
|
9月前
|
SQL 关系型数据库 MySQL
用C# 语言实现MYSQL 真分页
用C# 语言实现MYSQL 真分页
|
9月前
|
Java C# C++
C#语言入门学习
C#语言入门学习
|
10月前
|
存储 C# Windows
C#基础知识入门:从零起步学习C#语言
C#基础知识入门:从零起步学习C#语言
132 1