zoukankan      html  css  js  c++  java
  • 10_命令模式

    【命令模式】

    命令模式是一个高内聚的模式。

    将一个请求封装成一个对象,从而让你使用不用的请求将客户端参数化,对请求排队或者记录请求日志,提供命令的撤销和恢复功能。

    命令模式由以下4部分组成:

    1.Receiver接受者角色

    该角色是具体做事的角色,命令传递到这里被执行。

    2.Command抽象命令角色

    需要执行的命令在这里声明。

    3.ConcreteCommand具体命令角色

    通常会关联接受者(例子里的游戏人物:战士角色类),并调用接受者的功能来完成具体的操作。

    4.Invoker调用者角色

    接受到命令,并执行命令。(例子中的游戏玩家)

    命令模式较为简单,它的封装性较好,把请求方(Invoker)和执行方(接收方,Receiver)分开,保证了其扩展性。

    【命令模式 例子】

    package com.Higgin.Command;
    
    /**
     * 接受者角色:Receiver
     * 游戏中的战士类
     */
    class Soldier{
        public void shoot(){
            System.out.println("战士射击!!!");
        }
        
        public void run(){
            System.out.println("战士奔跑!!!");
        }
    }
    
    /**
     * 命令角色:Command
     * 抽象命令角色
     */
    interface Command{
        public void execute();
    }
    
    /**
     * 具体命令角色:ConcreteCommand
     * 具体的射击命令角色
     */
    class ConcreteShootCommand implements Command{
        private Soldier soldier;   //关联战士角色类
        
        public ConcreteShootCommand(Soldier soldier){
            this.soldier=soldier;
        }
        @Override
        public void execute() {
            this.soldier.shoot();
        }
    }
    /**
     * 具体命令角色:ConcreteCommand
     * 具体的奔跑命令角色
     */
    class ConcreteRunCommand implements Command{
        private Soldier soldier; //关联战士角色类
        
        public ConcreteRunCommand(Soldier soldier){
            this.soldier=soldier;
        }
        @Override
        public void execute() {
            this.soldier.run();
        }
    }
    
    /**
     * 调用者角色:Invoker
     * 游戏玩家角色
     */
    class GamePlayer{
        private Command shootCommand;  //射击命令
        private Command runCommand;    //奔跑命令
        public void setShootCommand(Command shootCommand) {
            this.shootCommand = shootCommand;
        }
        public void setRunCommand(Command runCommand) {
            this.runCommand = runCommand;
        }
        
        public void shoot(){  
            this.shootCommand.execute();
        }
        
        public void run(){
            this.runCommand.execute();
        }
    }
    
    public class TestCommand {
        public static void main(String[] args) {
            Soldier soldier=new Soldier();           //战士角色
            GamePlayer gamePlayer=new GamePlayer();  //游戏玩家角色
            
            Command shootCommand=new ConcreteShootCommand(soldier);  //射击命令
            gamePlayer.setShootCommand(shootCommand);
            gamePlayer.shoot();
            
            Command runCommand=new ConcreteRunCommand(soldier);      //奔跑命令
            gamePlayer.setRunCommand(runCommand);
            gamePlayer.run();
        }
    }

    【运行结果】

    【优点】

    * 类间解耦

    调用者和接收者之间没有任何依赖关系。调用者实现功能时只需调用Command抽象类的execute方法即可,不需要了解到底哪个是接收者。

    * 可扩展性

    Command类的子类ConcreteCommand具体命令角色可以非常容易地扩展,而调用者Invoker和高层次的模块Client不产生严重的代码耦合问题。

    * 命令模式结合其他模式会更优秀

    命令模式可以结合责任链模式,实现命令族解析任务。

    也可以结合模板方法模式,则可以减少Command子类的膨胀问题。

    【缺点】

    如果有N个命令,Command的子类就会是N个,会使得这个子类数量膨胀地非常多。

  • 相关阅读:
    Mac environment setting
    详解nginx.conf文件配置项(包括负载均衡)
    检查windows端口被占用
    linux下的环境变量
    利用MVC思想和php语言写网站的心得
    React学习:列表&&Key
    React学习:条件渲染
    事件处理
    state&生命周期
    react学习:组件&props
  • 原文地址:https://www.cnblogs.com/HigginCui/p/6222345.html
Copyright © 2011-2022 走看看