美文网首页
命令模式

命令模式

作者: 那年23 | 来源:发表于2018-12-27 13:08 被阅读5次

    概念

      说到命令模式,我就想到了公司让开发产品的时候,这里就靠这个举个例子。先来段具体的定义:将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型模式,其别名为动作(Action)模式或事务(Transaction)模式。

    角色

    抽象命令:定义操作。
    具体的命令:完成操作。
    调用者:添加命令和执行。
    执行者:提供具体命令执行操作(做事的)。

    上代码

      先解释下大概模拟的流程,产品经理向外界提供公司能进行的哪些开发,然后客户选择后,产品经理调用这些命令,让开发来开发产品。这里就将执行者与调用者分开了,避免各位开发大牛直接和客户接触。

    首先是执行者:各位开发大牛
    /**
     * 开发人员,这里模拟的是具体的执行者
     *
     */
    public class Coders {
        
        public void doApp(){
            System.out.println("开发app");
        }
        
        public void doWeb(){
            System.out.println("开发后台");
        }
        
        public void fixComputer(){
            System.out.println("修电脑");
        }
    }
    
    然后是抽象的命令接口与具体的命令
    public interface Demand {
        void execute();
    }
    
    /**
     * app 开发功能。
     * 像外包公司要向客户展示的,我们能做什么一样。
     *这里模拟的是具体的命令。
     */
    public class AppDemand implements Demand {
    
        private Coders coders;
    
        public AppDemand(Coders coders) {
            this.coders = coders;
        }
    
        @Override
        public void execute() {
            coders.doApp();
        }
    
    }
    
    public class WebDemand implements Demand {
        
        private Coders coders;
    
        public WebDemand(Coders coders) {
            this.coders = coders;
        }
    
        @Override
        public void execute() {
            coders.doWeb();
        }
    }
    
    接下来就是产品经理了,这里模拟的是调用者

      顺带说一嘴,这里本该添加删除操作的。

    /**
     * 产品经理。这里模拟的是调用者
     *
     */
    public class ProductorManager {
        
        private List<Demand> demands = new ArrayList<>();
        
        public void addDemands(Demand demand){
            demands.add(demand);
        }
        
        public void doProduce(){
            for(Demand demand:demands){
                demand.execute();
            }
            demands.clear();
        }
    }
    
    客户端测试类
    public class Client {
        public static void main(String[] args) {
            //开公司前的准备  向外界提供哪些  命令
            Coders coders = new Coders();
            ProductorManager pm = new ProductorManager();
            AppDemand app = new AppDemand(coders);
            WebDemand web = new WebDemand(coders);
            
            //具体的命令执行
            pm.addDemands(app);
            pm.addDemands(web);
            pm.doProduce();
            
        }
    }
    
    结果
    The End

    优点:实现了命令与执行者的分离,降低了耦合度;可以提供撤销操作。
    缺点:可能会导致具体的命令类过多。

    需要使用的时候,如果满足优点中的某一条即可。

    相关文章

      网友评论

          本文标题:命令模式

          本文链接:https://www.haomeiwen.com/subject/aksrlqtx.html