设计模式之观察者模式——猫抓老鼠:

问题描述:

通过猫抓老鼠的例子进行了解观察者模式,首先的初始代码为(有三个类):

using System;/// <summary>
/// 观察者设计模式——猫抓老鼠
/// </summary>
namespace Unity_Observe_mode
{class Program{static void Main(string[] args){Cat cat = new Cat("加菲", "黄色");Mouse mouse1 = new Mouse("米奇", "白色");Mouse mouse2 = new Mouse("米糊", "灰色");cat.CatComing(mouse1,mouse2);//猫的状态发生改变Console.ReadKey();}}
}

猫类:

using System;
using System.Collections.Generic;
using System.Text;/// <summary>
/// 观察者设计模式——猫抓老鼠
/// </summary>namespace Unity_Observe_mode
{/// <summary>/// 猫类/// </summary>class Cat{private string name;private string color;public Cat(string name,string color){this.name = name;this.color = color;}/// <summary>/// 猫的状态发生改变(被观察者状态发生改变)/// </summary>public void CatComing(Mouse mouse1,Mouse mouse2){Console.WriteLine(color + "的猫" + name + "过来了,喵喵喵!!");mouse1.RunAway();mouse2.RunAway();}}
}

老鼠类:

using System;
using System.Collections.Generic;
using System.Text;/// <summary>
/// 观察者设计模式——猫抓老鼠
/// </summary>
namespace Unity_Observe_mode
{/// <summary>/// 老鼠类-观察者类/// </summary>class Mouse{private string name;private string color;public Mouse(string name,string color){this.name = name;this.color = color;}public void RunAway(){Console.WriteLine(color + "的老鼠" + name + "说:老猫来了,赶紧跑! ");}}
}

分析:

首先,我们编写了三个类,其中猫为被观察者,而老鼠为观察者,当猫状态发生改变时,老鼠也相应的发生改变,如上代码便做到了这一点。
但是这种方案存在一个缺点:
如下代码:

        public void CatComing(Mouse mouse1,Mouse mouse2,Mouse mouse3){Console.WriteLine(color + "的猫" + name + "过来了,喵喵喵!!");mouse1.RunAway();mouse2.RunAway();mouse3.RunAway();}
            Mouse mouse1 = new Mouse("米奇", "白色");Mouse mouse2 = new Mouse("米糊", "灰色");Mouse mouse3 = new Mouse("米啊", "红色色");cat.CatComing(mouse1,mouse2,mouse3);//猫的状态发生改变

当新的观察者加入时,需要在猫类的方法中进行更改,这样会使代码越来越繁琐,而且我们希望写好一个猫类后尽量少改动其代码(对比初始代码)


通过委托进行优化:

我们在猫类中定义一个委托,然后将老鼠的方法加入委托中:

using System;/// <summary>
/// 观察者设计模式——猫抓老鼠
/// </summary>
namespace Unity_Observe_mode
{class Program{static void Main(string[] args){Cat cat = new Cat("加菲", "黄色");Mouse mouse1 = new Mouse("米奇", "白色");cat.catCome += mouse1.RunAway;Mouse mouse2 = new Mouse("米糊", "灰色");cat.catCome += mouse2.RunAway;Mouse mouse3 = new Mouse("米啊", "红色色");cat.catCome += mouse3.RunAway;//cat.CatComing(mouse1,mouse2,mouse3);//猫的状态发生改变,在cat中调用了观察者的方法,当观察者发生改变时,需要同时修改被观察者的代码,代码耦合性高了,不好!!cat.CatComing();Console.ReadKey();}}
}

猫类:

using System;
using System.Collections.Generic;
using System.Text;/// <summary>
/// 观察者设计模式——猫抓老鼠
/// </summary>namespace Unity_Observe_mode
{/// <summary>/// 猫类/// </summary>class Cat{private string name;private string color;public Cat(string name,string color){this.name = name;this.color = color;}/// <summary>/// 猫的状态发生改变(被观察者状态发生改变)/// </summary>public void CatComing(){Console.WriteLine(color + "的猫" + name + "过来了,喵喵喵!!");if(catCome!=null)catCome();}public Action catCome;//定义一个委托//public void CatComing(Mouse mouse1,Mouse mouse2,Mouse mouse3)//{//    Console.WriteLine(color + "的猫" + name + "过来了,喵喵喵!!");//    mouse1.RunAway();//    mouse2.RunAway();//    mouse3.RunAway();//}}
}

通过这样的方法降低了代码的耦合性。最后运行效果:

观察者模式—猫抓老鼠1,后面猫抓老鼠2将继续进行优化!

设计模式之观察者模式——猫抓老鼠1相关推荐

  1. 设计模式之观察者模式——猫抓老鼠2

    设计模式之观察者模式--猫抓老鼠2: 对猫抓老鼠1再次进行优化,降低代码复杂性,以及使用事件来对方法进行保护 代码优化: 将老鼠代码进行优化,将自己的方法在构造时便注册到猫里面: using Syst ...

  2. 猫抓老鼠-Java面向对象特点梳理

    我们先设计一个猫抓老鼠的小游戏: ⊙猫和老鼠都有名字和体重两种属性,猫有抓老鼠的方法,对应的老鼠则有逃跑的方法. ⊙首先游戏的结果是猫抓住了老鼠或者老鼠逃跑了,对于这两种情况,我们用体重来区分,若猫的 ...

  3. java猫抓老鼠_猫抓老鼠-Java面向对象特点梳理

    我们先设计一个猫抓老鼠的小游戏: ⊙猫和老鼠都有名字和体重两种属性,猫有抓老鼠的方法,对应的老鼠则有逃跑的方法. ⊙首先游戏的结果是猫抓住了老鼠或者老鼠逃跑了,对于这两种情况,我们用体重来区分,若猫的 ...

  4. 猫抓老鼠c语言程序,猫抓老鼠问题C++实现一例(约瑟夫环问题)

    今天偶然在网上看到了猫抓老鼠问题, 当时也没多想,只觉得网上给出的程序的确有很多需要改进的地方, 就闷头闷脑的用 循环链表 和 递归 写了一个算法实现,后来发现 这个问题实际上是经典的约瑟夫环问题的变 ...

  5. java猫抓老鼠_用猫抓老鼠的实例理解java中面向对象的编程与类和对象以及方法的概念...

    今天看到马士兵讲的关于面向对象编程的思路,用了一个猫抓老鼠的例子,我觉得这个例子非常形象,于是写在这里,方便学习理解和以后查看 class cat{ //声明一个类–"猫" int ...

  6. 实验吧WEB CTF 猫抓老鼠 全网最简单易懂的解题方法

    前言 题目网址: 实验吧平台升级维护中 需要用到的工具: burpsuite 官方视频教程: 01 02 开始 首先打开burpsuite,切换到Proxy选项卡,确保intercept是关着的. 打 ...

  7. 面向对象之猫抓老鼠小游戏

    面向对象之猫抓老鼠小游戏: 猫类的创建: 代码: package com.softeem.lesson08.example;public class Cat {private String name; ...

  8. CTF---Web入门第七题 猫抓老鼠

    猫抓老鼠分值:10 来源: 实验吧 难度:难 参与人数:8697人 Get Flag:3740人 答题人数:3944人 解题通过率:95% catch!catch!catch!嘿嘿,不多说了,再说剧透 ...

  9. 实验吧 WEB 猫抓老鼠

    人生的第一道CTF题目哇,鸡冻 其实只是学了一下HTTP抓包得到的都是什么,就开始上手胡搞了 题目名字叫猫抓老鼠,还疯狂暗示catch!catch!catch!catch!,就想到要用抓包其实我是因为 ...

最新文章

  1. 图像与视频合成领域的集大成者,都在这里了!
  2. PIE SDK图层树伙伴控件示例
  3. mysql mtop_mysqlmtop2.2运行出错
  4. linux 与window 相互共享命令
  5. 零基础学习嵌入式给出的10条中肯的建议
  6. Java实现冒泡排序算法
  7. Python制作一个科学计算器
  8. 【重装Windows的十大理由】
  9. 生鲜电商之百果园的未来
  10. 数据库课程设计------书店管理系统
  11. 特殊的搜狗拼音输入法
  12. 蓝牙模块HC05遇到的一些常见的问题
  13. php1.6t发动机机油选择,1.6t用什么机油选择啊!?
  14. KNN 在手写识别中的应用(Java 实现)
  15. ueditor 工具栏配置_Ueditor文本编辑工具栏自定义
  16. 与SCI主编邮件沟通模板
  17. 苹果6如何截屏_手机截屏新方法,点击屏幕就能轻松截屏,方法很简单,一看就会...
  18. Python学习笔记-Day2
  19. Mac 抓取iOS手机端的crash日志操作
  20. YSlow开发:自定义规则集

热门文章

  1. FFmpeg入门详解之124:Qt5 FFmpeg单路网络摄像头采集预览
  2. WaveSwipeRefreshLayout实现微信热文精选,微信热文安卓app版,activity中viewpager套fragment
  3. CPU与GPU区别 通俗易懂
  4. shell脚本掐头去尾
  5. UEFI引导+GPT分区模式如何安装win10原版镜像或ghost版
  6. 开源web框架_带有酷名称的开源JavaScript和Web框架的词汇表
  7. 微信iOS长按无法识别二维码
  8. 网上书店信息管理系统--基于Mysql数据库与java
  9. 30岁程序员:总在错过风口,终于熬成“码畜”
  10. 硬件工程师成长之路(0)----认识元件