设计模式-6-命令模式

来源:互联网 发布:淘宝达人在哪里找 编辑:程序博客网 时间:2024/06/05 16:37

命令模式

原理:每一个命令都是一个操作,请求的一方发出请求要求执行一个操作,接收的一方收到请求并且执行操作
用在一个请求者 请求 接收者调用其方法完成某项任务的模式
在这个过程中请求者和接收者不直接打交道而是把这个请求封装到一个命令的对象中,然后在这个对象中条用接收者的操作方法

结构
接收者:接收者是一个类的实例,该实例负责执行与请求相关的操作
命令:命令是一个接口,负责封装请求的若干个方法
具体命令:具体命令是实现命令接口的类的实例,具体命令必须实现命令接口中的方法
请求者:请求者是一个包含“命令接口”变量的类的实例
             请求者中“命令”接口的变量可以存放任何具体命令的引用
             请求者负责调用具体命令,让具体命令执行那些封装了请求的方法

例子

日常生活中我们可以通过遥控器控制电视的开关和调频,这里我们就可以使用命令模式(控制器是请求者,电视是执行者)

代码示例

接收者
//接受者public class TvReceiver {public int currentChannel;public void tvTurnOn(){System.out.println("电视已经打开");}public void tvTurnOff(){System.out.println("电视已经关闭");}public void changeChannel(int Channel){currentChannel = Channel;System.out.println("电视的台已经改变"+currentChannel);}}
命令的接口
//TV命令的抽象接口public interface TvCommand {public void execute();}
具体命令(通过命令让接收者执行具体的操作)
开电视的具体命令
//具体命令开机public class TvTurnOnCommand implements TvCommand{TvReceiver tvReceiver = new TvReceiver();public TvTurnOnCommand(TvReceiver tvReceiver) {// TODO Auto-generated constructor stubthis.tvReceiver = tvReceiver;}@Overridepublic void execute() {// TODO Auto-generated method stubtvReceiver.tvTurnOn();}}
改变频道的具体命令
//具体命令改变频道public class TvChangeChannelCommand implements TvCommand {private TvReceiver tvReceiver;private int currentChannel;public  TvChangeChannelCommand( TvReceiver tvReceiver,int currentChannel) {this.tvReceiver = tvReceiver;this.currentChannel = currentChannel;// TODO Auto-generated constructor stub}@Overridepublic void execute() {// TODO Auto-generated method stubtvReceiver.changeChannel(currentChannel);}}
关电视的具体命令
//具体命令关机public class TvTurnOffCommand implements TvCommand{private TvReceiver tvReceiver;public TvTurnOffCommand(TvReceiver tvReceiver) {this.tvReceiver =tvReceiver;// TODO Auto-generated constructor stub}@Overridepublic void execute() {// TODO Auto-generated method stubtvReceiver.tvTurnOff();}}

请求者
public class TvControl {private TvCommand tvTurnOffCommand;private TvCommand tvTurnOnCommand;private TvCommand tvChangeChannelCommand;public TvControl(TvCommand tvTurnOffCommand, TvCommand tvTurnOnCommand,TvCommand tvChangeChannelCommand) {// TODO Auto-generated constructor stubthis.tvChangeChannelCommand = tvChangeChannelCommand;this.tvTurnOnCommand = tvTurnOnCommand;this.tvTurnOffCommand = tvTurnOffCommand;}public void tvTurnOn(){tvTurnOnCommand.execute();}public void tvTurnff(){tvTurnOffCommand.execute();}public void tvChangeChannel(){tvChangeChannelCommand.execute();}}

客户端
public class Main {public static void main(String[] args) {// TODO Auto-generated method stub//命令接收器 TvReceiver tvReceiver = new TvReceiver();//具体命令TvTurnOnCommand tvTurnOnCommand = new TvTurnOnCommand(tvReceiver);TvTurnOffCommand tvTurnOffCommand = new TvTurnOffCommand(tvReceiver);TvChangeChannelCommand tvChangeChannelCommand = new TvChangeChannelCommand(tvReceiver,5);//命令的控制器TvControl tvControl = new TvControl(tvTurnOffCommand, tvTurnOnCommand, tvChangeChannelCommand);//通过控制器执行命令(控制器通过控制命令,然后命令去执行具体的操作)//控制器发出电视的开改变频道关的命令,然后在这些方法中具体执行具体命令的方法,具体命令的方法是调用电视的开调频关方法tvControl.tvTurnOn();tvControl.tvChangeChannel();tvControl.tvTurnff();}}

运行结果
电视已经打开电视的台已经改变5电视已经关闭

总结

1.命令模式的本质是:对命令的封装,将发出命令的责任和执行命令的责任分开
2.将请求的一方和接收的一方分割开来,使请求的一方不必知道接收的一方的接口,更不必知道请求是怎么被接收,以及操作是怎么被执行的
3.有更好的扩展性:如果要增加新的命令,创建一个新的命令的类就好了



1 0
原创粉丝点击