设计模式之命令模式

(各种设计模式的源代码在 https://github.com/mjnjust/Designmode.git ,使用utf8编码)
一、定义

将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化。
我觉得命令模式和中介者模式有一点相似,中介者模式连接的是多个类之间的联系,而命令模式联系的是客户端和类。 比如说,在软件公司给客户制作一款软件的时候,软件公司内部有很多的划分,写代码的、写页面的、做需求分析的、做测试的等等,客户向软件公司提出一个需求,软件公司就要满足客户的需求。加入软件公司和客户商量好,客户要改动代码的就去找代码组,要修改页面的就去找美工组......这样会造成客户和软件公司的沟通不变,而且客户不能确认自己的需求到底该找谁。因此,项目经理这个职位就出了,它可以很好的做为客户和软件公司沟通的桥梁。

二、实例

命令模式里面有三个角色

    命令角色:定义命令,这个命令是干什么的。
    执行角色:执行某个命令
    调用角色:就是项目经理的角色
我们的上层模块只知道把产生一个命令,然后把命令交给调用角色,调用角色执行就OK了。
例子:软件公司有代码组和美工组,客户相应的命令有编码命令和美化命令,有一个项目经理负责传递客户的命令。

首先定义一个命令的基础类,这个类知道应该让谁去处理这个命令。

public abstract class Command {
 protected Receiver receiver ;
 public Command(Receiver receiver) {
  this.receiver = receiver ;
 }
 public abstract void execute();
}

具体的命令类:美化命令和编码命令

//美化
public class ButiCommond extends Command{

 public ButiCommond(Receiver receiver) {
  super(receiver);
 }
 public ButiCommond() {
  super(new ButiReceiver());
 }
 @Override
 public void execute() {
  super.receiver.execute();
 }
}
//编码
public class CodeCommond extends Command {

 public CodeCommond(Receiver receiver) {
  super(receiver);
 }
 public CodeCommond() {
  super(new CodeReceiver());
 }
 @Override
 public void execute() {
  super.receiver.execute();
 }

}

执行者的基础类

public abstract class Receiver {
 abstract public void execute();
}

具体的执行类:美化执行者和编码执行者
/

/美化执行者
public class ButiReceiver extends Receiver{

 @Override
 public void execute() {
  System.out.println("美工组美工!");
 }

}
//编码执行者
public class CodeReceiver extends Receiver {

 @Override
 public void execute() {
  // TODO Auto-generated method stub
  System.out.println("编程组进行编程!");
 }

}

调用者类(项目经理)

public class Invoke {

 private Command command = null ;

 public void setCommand(Command command) {
  this.command = command;
 }
 public void action() {
  this.command.execute();
 }

}

测试代码:

Invoke manager = new Invoke();
  ButiCommond butiCommond = new ButiCommond();
  CodeCommond codeCommond = new CodeCommond();
  manager.setCommand(codeCommond);
  manager.action();
  manager.setCommand(butiCommond);
  manager.action();

结果:

编程组进行编程!
美工组美工!

三、优缺点
有点: 上层模块只需要知道命令类型和调用者,而不需要知道命令是由是完成,怎么完成。
缺点:每一条命令都要写一个类,如果命令种类很多,那么项目中相似的类就会很多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值