设计模式之Command——电视篇
每天晚上,抢电视遥控器都是我们家的保留节目。女儿喜欢看卡通屏道,老婆喜欢看电视剧屏道,我呢则喜欢看足球屏道。因此谁控制了遥控器,就等于实现了自己的节目梦想了。嘿嘿,其实每次都是我女儿成功得到,而且她还每次都阵阵有词的说:“大的应该让小的吗?”,你看这孩子,不知跟谁学的。然后遥控器就是老婆的,最后才轮到我,当我高兴的按到足球屏道时,播音员说:“今天的节目就到这里了,请明天在看!”,我倒地狂呕血。
大家都知道电视遥控器节目面板(ProgramPan)是由节目按钮组成,通过选择相应的节目按钮,就可以切换到相应的节目屏道。
下来让我们看看如何实现通过遥控器按钮选择节目屏道的过程吧。
1、在这里,先定义遥控器按钮(RemoteControlButton)接口:
public interface RemoteControlButton {
public abstract void selectProgram(); //选择节目屏道
}
2、再定义遥控器按钮(RemoteControlButton)接口的实现类:
A:卡通节目按钮(CartonProgramButton)类:
public class CartonProgramButton implements RemoteControlButton{
public void selectProgram() {
System.out.println("选择了卡通屏道!");
}
}
B:电视剧节目按钮(TvPlanProgramButton)类:
public class TvPlanProgramButton implements RemoteControlButton {
public void selectProgram() {
System.out.println("选择了电视剧屏道!");
}
}
C:足球节目按钮(FootProgramButton)类:
public class FootProgramButton implements RemoteControlButton {
public void selectProgram() {
System.out.println("选择了足球屏道!");
}
}
3、遥控器节目面板(ProgramPan)类:用来控制节目按钮,显示节目
public class ProgramPan {
public static List programList() {
List list = new ArrayList(); //节目屏道按钮列表
list.add(new CartonProgramButton()); //卡通屏道按钮
list.add(new TvPlanProgramButton()); //电视剧屏道按钮
list.add(new FootProgramButton()); //足球屏道按钮
return list;
}
}
4、编写测试类:
public class TestCommand {
public static void main(String[] args) {
List list = ProgramPan.programList(); //获得节目屏道按钮
for (Iterator it = list.iterator();it.hasNext();)
( (RemoteControlButton) it.next()).selectProgram(); //选择节目屏道中对应的节目
}
}
5、说明:
A:Command说白了就是通过选择一个个命令,然后执行相应动作。
B:Command是对行为进行封装的典型模式,在本例中通过遥控器节目面板(ProgramPan)这个封装类来实现我们看电视节目的目的。
C:Command模式和Facade(外观)模式似乎比较相似。都是通过封装类来进行访问的。如何区分,对这点我也比较疑惑。