`

设计模式之命令模式

 
阅读更多

        命令模式是一个高内聚的模式,其定义如下:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录日志,可以提供命令的撤销和恢复功能。

 

命令模式的通用类图如下:



 

 

        命令模式是对命令的封装,命令模式把发出命令的责任和执行命令的责任分开,委派给不同的对象。每一个命令都是这样一个操作:请求一方发出要求执行一个操作,接收的一方收到请求并执行操作,命令模式允许请求方和执行方独立。

 

命令模式具有下列特点:

1.类见解耦

执行者和接收者之间没有任何依赖关系,调用者实现时只需要调用Command抽象类的execute方法就可以了,不需要知道到底是那个接收者执行。

 

2.扩展性高

Command的子类可以非常容易扩展,而调用者Invoker和高层次的模块Client不产生严重的耦合

 

任何事物都不可能十全十美,命令模式的缺点就是可能会出现类膨胀的情况,就是命令类Command的子类会出现多个的情况

 

通用类图的源码如下:

 

/**
 * 抽象命令类
 * 
 */
public abstract class Command {

    protected abstract void execute();
}

 

/**
 * 命令的具体实现类
 * 
 */
public class ConcreteCommand extends Command {

    private Reciver reciver;

    public ConcreteCommand(Reciver reciver) {

        this.reciver = reciver;
    }

    /**
     * 命令的执行方法
     * 
     * @see com.huashao.chapter.chapter15.ch01.Command#execute()
     */
    @Override
    protected void execute() {

        reciver.action();
    }

}

 

/**
 * 接收者角色
 * 
 */
public class Reciver {

    public void action() {

        System.out.println("保证完成任务");
    }
}

 

public class Invoker {

    private Command command;

    public Invoker(Command command) {

        this.command = command;
    }

    public void action() {

        this.command.execute();
    }
}

 

public class Client {

    public static void main(String[] args) {
        // 创建接收者
        Reciver reciver = new Reciver();
        // 创建命令
        Command command = new ConcreteCommand(reciver);
        // 创建执行者
        Invoker invoker = new Invoker(command);
        // 执行请求
        invoker.action();
    }
}

 

最近在做一个电商结算项目,其中有这么一个功能:整个界面就是一个查询,不过查询的条件有很多种,截图如下:

 



 

看看能不能用命令模式的方式实现(使用命名模式好不好先放在一边),那么我们是不是就可以将每一种查询类型看做一个命令呢

 

类图如下:

 



 

代码如下:

 

/**
 * 命令对象
 * 
 */
public class CommandVO {

    private String command;

    private String value;

    /**
     * 
     */
    public CommandVO() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @param command
     * @param value
     */
    public CommandVO(String command, String value) {
        super();
        this.command = command;
        this.value = value;
    }

    public String getCommand() {
        return command;
    }

    public void setCommand(String command) {
        this.command = command;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

}

 

public class ResultVO {

    private String sequence;

    private String type;

    public String getSequence() {
        return sequence;
    }

    public void setSequence(String sequence) {
        this.sequence = sequence;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "[查询主键:" + sequence + " 交易类型:" + type + "]";
    }

}

 

/**
 * 命令对象的接口
 * 
 */
public interface QueryCommand {

    // 查询方法
    public List<ResultVO> execute(CommandVO commandVO);
}

 

/**
 * 根据票号查询
 * 
 */
public class TktNoQueryCommand implements QueryCommand {

    
    private QueryReciver reciver;

    public TktNoQueryCommand(QueryReciver reciver) {

        this.reciver = reciver;
    }
    
    /**
     * @param commandVO
     * @return
     */
    @Override
    public List<ResultVO> execute(CommandVO commandVO) {
        // TODO Auto-generated method stub
        return reciver.tktNoQuery(commandVO);
    }

}

 

/**
 * 根据订单号查询
 * 
 */
public class OrderNoQueryCommand implements QueryCommand {

    private QueryReciver reciver;

    public OrderNoQueryCommand(QueryReciver reciver) {

        this.reciver = reciver;
    }
    
    /**
     * @param commandVO
     * @return
     */
    @Override
    public List<ResultVO> execute(CommandVO commandVO) {
        // TODO Auto-generated method stub
        return reciver.orderNoQuery(commandVO);
    }

}

 

/**
 * 根据退款订单号查询
 * 
 */
public class RefundNoQueryCommand implements QueryCommand {

    private QueryReciver reciver;

    public RefundNoQueryCommand(QueryReciver reciver) {

        this.reciver = reciver;
    }

    /**
     * @param commandVO
     * @return
     */
    @Override
    public List<ResultVO> execute(CommandVO commandVO) {
        return reciver.refundNoQuery(commandVO);
    }

}

 

/**
 * 查询的接收者
 * 
 */
public class QueryReciver {

    // 根据退款订单号查询
    public List<ResultVO> refundNoQuery(CommandVO commandVO) {
        
        System.out.println(commandVO.getCommand());
        //模拟从数据库获取结果
        List<ResultVO> list=new ArrayList<ResultVO>();
        
        ResultVO vo=new ResultVO();
        
        vo.setSequence(commandVO.getValue());
        vo.setType("RFD");
        list.add(vo);
        return list;

    }

    // 根据票号查询
    public List<ResultVO> tktNoQuery(CommandVO commandVO) {
      
        System.out.println(commandVO.getCommand());
        //模拟从数据库获取结果
        List<ResultVO> list=new ArrayList<ResultVO>();
        
        ResultVO vo=new ResultVO();
        
        vo.setSequence(commandVO.getValue());
        vo.setType("RFD");
        list.add(vo);
        return list;

    }

    // 根据订单号查询
    public List<ResultVO> orderNoQuery(CommandVO commandVO) {
        
        System.out.println(commandVO.getCommand());
        //模拟从数据库获取结果
        List<ResultVO> list=new ArrayList<ResultVO>();
        
        ResultVO vo=new ResultVO();
        
        vo.setSequence(commandVO.getValue());
        vo.setType("SAL");
        list.add(vo);
        return list;

    }
}

 

public class Client {

    public static void main(String[] args) {

        // 创建接收者
        QueryReciver reciver = new QueryReciver();
        // 创建命令对象
        CommandVO vo = new CommandVO("TktNo", "232424");
        // 创建命令
        QueryCommand command = null;

        if ("TktNo".equalsIgnoreCase(vo.getCommand())) {
            command = new TktNoQueryCommand(reciver);
        }

        // 创建执行者
        Invoker invoker = new Invoker();
        invoker.setCommand(command);

       List<ResultVO> list= invoker.query(vo);
       
       for(ResultVO vo2:list){
           System.out.println(vo2);
       }
    }

}

 

因为我们用的Struts2+Spring+Hibernate的模式开始,那么上面的类图如何体现在这几个框架上呢?

Invoker就是相当于我们写的Action类,而Command类就相当于Service 那么Reciver就相当于Dao

这样我们就可以通过注入的方式将这些类联系起来

  • 大小: 22.7 KB
  • 大小: 20.9 KB
  • 大小: 86.7 KB
分享到:
评论

相关推荐

    设计模式之命令模式案例代码

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在本文中,我们将深入探讨命令模式的原理、结构和实际应用,并...

    深入浅出设计模式之命令模式

    ### 深入浅出设计模式之命令模式 #### 前言 设计模式作为软件工程中的重要组成部分,为开发者提供了解决常见问题的有效途径。在众多设计模式中,命令模式是一种行为型设计模式,它把请求封装成对象,以便使用不同的...

    [行为模式] head first 设计模式之命令模式(Command)

    【行为模式】Head First 设计模式之命令模式(Command) 命令模式是一种行为设计模式,它将请求封装为一个对象,从而使我们能支持可撤销的操作、参数化对象以及将请求排队等高级操作。在Head First的设计模式书中,...

    java设计模式之命令模式

    **Java设计模式之命令模式详解** 命令模式是一种行为设计模式,它将请求封装为一个对象,使得你可以使用不同的请求、队列或者日志请求,也可以支持可撤销的操作。在Java编程中,命令模式广泛应用于解耦请求的发送者...

    设计模式之命令模式源码示例

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在软件工程中,这种模式广泛应用在各种场景中,以提高代码的灵活...

    设计模式之命令模式(Command)

    命令模式是一种行为设计模式,它的主要目的是将请求者与接收者解耦,使得请求的发起者无需知道哪个对象会执行这个请求,同时也让系统更容易扩展。这种模式在软件工程中广泛应用,特别是在事件驱动和分布式系统中。 ...

    Java设计模式之命令模式/Java函数式编程 笔记

    Java设计模式之命令模式/Java函数式编程 笔记

    设计模式之命令模式(Command Pattern)

    命令模式是一种行为设计模式,它将请求封装成独立的对象,使得可以使用不同的请求、队列请求、记录请求历史以及支持可撤销的操作。这种模式在软件工程中被广泛应用,尤其是在需要解耦请求发起者和接收者时,提高了...

    23钟设计模式之命令模式

    命令模式是一种行为设计模式,它的主要目的是将请求封装为一个对象,以便支持可撤销的操作、参数化不同命令以及将命令的执行与请求者解耦。在23种经典设计模式中,命令模式因其灵活性和实用性而被广泛使用。 在命令...

    设计模式之命令模式详解(内附有例子,无源码)

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在软件工程中,这种模式常用于降低系统之间的耦合度,提高灵活性...

    设计模式之命令模式Java实现

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在Java中实现命令模式,我们可以按照以下步骤进行: 1. **定义...

    c++-设计模式之命令模式(Command Pattern)

    命令模式(Command Pattern)是一种行为型设计模式,它将请求封装为对象,从而使您可以使用不同的请求、队列请求或日志请求,并支持可撤销操作。命令模式通常用于实现操作的解耦,使得发送者和接收者之间不直接关联...

Global site tag (gtag.js) - Google Analytics