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

    Java设计模式之命令模式

    命令模式的概念其实还挺模糊的,虽然不难,但是直接看起来也有点晕,直接看代码过一遍再去了解概念会好一些。

    其实简单的说命令模式就是将一个"请求"封装成一个对象,通过这个对象直接就能找到对应的执行命令。

    优点:

    好处是对于需要重复修改或实现的一些固定的操作,可以很方便的去执行,而不用抽丝剥茧的每次都和细分后的环节打交道,只需要和一个接受者打交道就行了。比如客户经常需要频繁的改需求,如果让客户每次都和美工组或者程序猿直接沟通,偶尔还好,要是次数多了就会显得很麻烦,而如果客户直接把他的想法告诉一个固定的人,这个人接收到客户的想法后直接就可以调用相应的对象去执行。

    缺点:

    如果客户要不断实现的需求有很多种类,那就得不断的增加相应的功能实现,就会弄得很麻烦。

    先看一张UML图,了解下每一层的关系

    虽然流程图是从上往下看的,但是实现过程我们得根据现实来,先从底层开始一点点实现

    干活前得先把人凑齐了,所以先组建一个项目组

    package com.company;
    
    
    //项目组
    public abstract class Group {
    
    //    规定项目组具备的功能,增删改查四个功能
        abstract void find();
        abstract void add();
        abstract void delet();
        abstract void change();
    
    
    
    }

    人凑齐了需要进行分工和准备工具,这里分成了需求、美工、和代码三个组,每个组都实现了项目组里的功能

    代码组

    package com.company;
    
    public class Code extends Group {
        @Override
        void find() {
            System.out.println("查到代码组");
        }
    
        @Override
        void add() {
            System.out.println("实现一个代码功能");
        }
    
        @Override
        void delet() {
            System.out.println("删除一个代码功能");
        }
    
        @Override
        void change() {
            System.out.println("修改一个代码功能");
        }
    
    
    }

    需求组

    package com.company;
    
    public class Require extends Group {
        @Override
        void find() {
            System.out.println("查找到需求组");
        }
    
        @Override
        void add() {
            System.out.println("增加一个需求");
        }
    
        @Override
        void delet() {
            System.out.println("删除一个需求");
        }
    
        @Override
        void change() {
            System.out.println("修改一个需求");
        }
    
    }

    美工组

    package com.company;
    
    public class Ui extends Group {
        @Override
        void find() {
            System.out.println("查找到美工组");
        }
    
        @Override
        void add() {
            System.out.println("增加一个美工页面");
        }
    
        @Override
        void delet() {
            System.out.println("删除一个美工页面");
    
        }
    
        @Override
        void change() {
            System.out.println("修改一个美工页面");
    
        }
    
    
    }

    人和工具都有了,现在需要从项目组里选出一个人来和客户进行对接,客户有什么想法直接告诉这个人就行了,这样就不需要去和代码组或者美工这些人沟通了

    package com.company;
    
    
    /*该类是项目组中出的一个项目负责人也就是接收人,
            当这个接收人接到了客户的命令的时候,根据这个命令执行相应的动作*/
    public class GroupMan {
    
    
        Conmand conmand;
        
    
        //    得到客户命令
        public void getConmand(Conmand conmand){
            this.conmand = conmand;
        }
    
    //    执行方法
        public void action(){
            conmand.execute();
        }
    
    
    }

    客户可以直接把功能命令告诉这个接收人,那么现在需要一个功能命令

    package com.company;
    
    public abstract class Conmand {
    
    
    //命令中的执行方法,执行的具体实现由项目组中的分组分别去实现
         abstract void execute();
    
    
    }

    功能命令需要具体的功能去实现它,比如说增加一个代码功能或者删除一个美工图片

    这里先实现一个:"增加代码功能"的功能命令

    package com.company;
    
    public class AddCode extends Conmand {
    
        Code code = new Code();//该功能由代码组的人员去实现
    
        @Override
        void execute() {
            code.find();
            code.add();
        }
    
    
    }

    其实从这里就可以看出这个命令模式的缺点了,如果客户后面要增加的功能命令有好多,那么这里就需要实现很多具体的功能,这样就很繁琐了

    下面就是整个项目动起来的效果了

    package com.company;
    
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Set;
    
    public class Main {
    
        public static void main(String[] args) {
    
    
            System.out.println("客户给出一个命令:我需要增加一个代码功能");
    
            //产生命令
            Conmand conmand = new AddCode();
    
    //        叫来项目对接人
            GroupMan groupMan = new GroupMan();
    
            //告诉项目对接人命令
            groupMan.getConmand(conmand);
    
            //项目对接人知道命令后去落实这个命令了:在这背后是这个对接人通知了Group组中的Code组去实现了这个功能
            groupMan.action();
    
    
        }
    
    
    }

  • 相关阅读:
    团队工作第四次推进之——软件设计规格说明书
    失物找寻APP软件需求规格说明书——第三次团队作业
    你还在为校园内丢失东西无处可寻而发愁吗?速戳进来
    十分有趣却有些遗憾的结对编程——两位女程序员的挣扎
    结对编程初涉猎——结对伙伴的代码复审
    个人实战演练全过程——No.1 最大连续子数组求和
    小白出品 单元测试相关——入门级说明书
    写着写着停不下来的普通女程序员的总结
    vs2010 和vs2012的区别 副标题--Loaded事件走两次
    汽车防撞软件引发的一套软件系统思路
  • 原文地址:https://www.cnblogs.com/lyd447113735/p/11728033.html
Copyright © 2011-2022 走看看