没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示


试读
17页
提起Command模式,我想没有什么比遥控器的例子更能说明问题了,本文将通过它来一步步实现GOF的Command模式。 我们先看下这个遥控器程序的需求:假如我们需要为家里的电器设计一个远程遥控器,通过这个控制器,我们可以控制电器(诸如灯、风扇、空调等)的开关。我们的控制器上有一系列的按钮,分别对应家中的某个电器,当我们在遥控器上按下“On”时,电器打开;当我们按下“Off”时,电器关闭。 好了,让我们开始Command 模式之旅吧。
资源推荐
资源详情
资源评论













Command 模式 Step by Step
引言
提起 Command 模式,我想没有什么比遥控器的例子更能说明问题了,本文将通过
它来一步步实现 GOF 的 Command 模式。
我们先看下这个遥控器程序的需求:假如我们需要为家里的电器设计一个远程遥控器,
通过这个控制器,我们可以控制电器(诸如灯、风扇、空调等)的开关。我们的控制器上有
一系列的按钮,分别对应家中的某个电器,当我们在遥控器上按下“On”时,电器打开;当
我们按下“O”时,电器关闭。
好了,让我们开始 Command 模式之旅吧。
HardCoding 的实现方式
控制器的实现
一般来说,考虑问题通常有两种方式:从最复杂的情况考虑,也就是尽可能的深谋远
虑,设计之初就考虑到程序的可维护性、扩展性;还有就是从最简单的情况考虑,不考虑
扩展,客户要求什么,我们就做个什么,至于以后有什么新的需求,等以后再说。当然这
两种方式各有优劣,本文我们从最简单的情况开始考虑。
我们假设控制器只能控制 三个电器,分别是:灯、电扇、门(你就当是电子门好了^
^)。那么我们的控制器应该有三组,共六个按钮,每一组按钮分别有“On”,“O”按钮。
同时,我们规定,第一组按钮对应灯,第二组按钮对应电扇,第三组则对应门,那么控制
器应该就像这样:

类的设计
好了,控制器大致是这么个样子了,那么 灯、电扇、门又是什么样子呢?如果你看
过前面几节的模式,你可能会以为此时又要为它们创建一个基类或者接口,然后供它们继
承或实现。现在让我们先看看我们想要控制的电器是什么样子的:
很抱歉,你遗憾地发现,它们的接口完全不同,我们没有办法对它们进行抽象,但是
因为我们此刻仅考虑客户最原始的需求(最简单的情况),那么我们大可以直接将它们复合
到 遥控器(ControlPanel) 中
NOTE:关于接口,有狭义的含义:就是一个声明为 interface 的类型。还有一个广
义的含义:就是对象暴露给外界的方法、属性,所以一个抽象类也可以称作一个接口。这
里,说它们的接口不同,意思是说:这三个电器暴露给外界的方法完全不同。

注意到,PressOn 方法,它代表着某一个按键被按下,并接受一个 int 类型的参数:
SlotNo,它代表是第几个键被按下。显然,SlotNo 的取值为 0 到 2。对于 PressO 则是
完全相同的设计。
代码实现
namespace Command {
// 定义灯
public class Light{
public void TurnOn(){
Console.WriteLine("The light is turned on.");
}
public void TurnO() {
Console.WriteLine("The light is turned o.");
}
}
// 定义风扇
public class Fan {
public void Start() {
Console.WriteLine("The fan is starting.");
}
public void Stop() {
Console.WriteLine("The fan is stopping.");
}
}
// 定义门

public class Door {
public void Open() {
Console.WriteLine("The door is open for you.");
}
public void Shut() {
Console.WriteLine("The door is closed for safety");
}
}
// 定义遥控器
public class ControlPanel {
private Light light;
private Fan fan;
private Door door;
public ControlPanel(Light light, Fan fan, Door door) {
this.light = light;
this.fan = fan;
this.door = door;
}
// 点击 On 按钮时的操作。slotNo,第几个按钮被按
public void PressOn(int slotNo){
switch (slotNo) {
case 0:
light.TurnOn();
break;
case 1:
fan.Start();
break;
case 2:
door.Open();
break;
}
}
// 点击 O 按钮时的操作。
public void PressO(int slotNo) {
switch (slotNo) {
case 0:
light.TurnO();
break;
case 1:
fan.Stop();
剩余16页未读,继续阅读
资源评论


rongq2007
- 粉丝: 14
- 资源: 25
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


安全验证
文档复制为VIP权益,开通VIP直接复制
