23种设计模式之_命令行模式

来源:互联网 发布:乐宝宝 乐普数据下载 编辑:程序博客网 时间:2024/06/06 15:00

前言
设计模式也已经总结了十多种,总的来说的还是对java的三大特性进行反复使用,形成的固定写法,越往后面学习,越觉得23种设计模式就是对java三大特性总结的缩小版。仅个人愚见

定义:命令行模式并非一行行命令的执行,而是写法上类似对一个具体逻辑的封装。(内部进行封装具体的实现)

Uml类图

这里写图片描述

衍生出来命令行模式写法
这里写图片描述

源码分析

由于实在是简单,看着类图就可以联想出来具体的实现方式,这里不进行贴代码,只是把命令行模式贴出来(还是贴…….)

Client( 客户端)

package patterncommond;public class Client {    public static void main(String[] args) {        Commond commond = new DeleCodeCommond();        Invorker invorker = new Invorker();        invorker.setCommond(commond);        invorker.actionCommond();        /* 撤销不做了 */        Commond undoCommond = new UnDoCodeCommond();        invorker.setCommond(undoCommond);        invorker.actionCommond();    }}

客户端,类似使用程序的客户,想要改需求,则需要通过Invorker(项目经理)发布ActionCommond进行具体实现

Commond(命令)

package patterncommond;public abstract class Commond {    protected Coder coder = new Coder(); // 代码编写    protected MG mg = new MG();// ui切图    /**     * 具体命令的执行模板     */    abstract void exe();}

Inverker(项目经理)

package patterncommond;public class Invorker {    protected Commond commond; // 抽象命令    /**     * 设置命令     *      * @param commond     */    public void setCommond(Commond commond) {        this.commond = commond;    }    /**     * 执行命令     */    public void actionCommond() {        commond.exe();    }}

Inverker类只负责接受命令和分发(actionCommond)命令到下层进行具体实现

DelCodeCommond具体命令

package patterncommond;public class DeleCodeCommond extends Commond {    @Override    void exe() {        super.coder.find();        super.coder.del();        super.coder.plan();    }}

具体的一条命令,del 一行代码,Abstract Commond类中存储了具体人员的引用,包括 MG,CODER …,删除代码是Coder做的,那么在具体的命令封装类中调用相应的人员进行操作即可

Coder(代码工,哈哈)

package patterncommond;public class Coder extends Group {    @Override    void add() {        System.out.println("增加功能");    }    @Override    void find() {        System.out.println("找到 coder");    }    @Override    void del() {        System.out.println("del功能");    }    @Override    void modify() {        System.out.println("modify功能");    }    @Override    void plan() {        System.out.println("变更报告清单");    }}

Coder就是现实中的编程人员,进行具体的操作

MG(美工)

 package patterncommond;public class MG extends Group {    @Override    void add() {        System.out.println("MG add功能 ");    }    @Override    void find() {        System.out.println("找到 MG 组 ");    }    @Override    void del() {        System.out.println("MG del功能");    }    @Override    void modify() {        System.out.println("MG modify功能");    }    @Override    void plan() {        System.out.println("变更报告清单");    }}

MG就是现实中的编美工,ui设计,进行具体的操作

unDoCodeCommond

package patterncommond;public class UnDoCodeCommond extends Commond {    @Override    void exe() {        System.out.println("撤销不做");    }}

撤销不做了,当然这里只是简单的比较,同样客户也可以下一个需要MG和 Coder配合命令,当然现实中就是协同工作

Eg:更新ui的同时coder也需要更新

@overidePublic void exe(){        super.coder.find();        super.coder.del();        super.coder.plan();        super.mg.find();        super.mg.modify();        super.mg.plan();}

执行结果

找到 coder
del功能
变更报告清单
找到 MG
Modify 功能
变更报告清单

命令行通用类图

这里写图片描述

总结:在这个类图中,我们看到三个角色:
Receiver 角色:这个就是干活的角色,命令传递到这里是应该被执行的,具体到上面我们的例子中就是
Group 的三个实现类;
Command 角色:就是命令,需要我执行的所有命令都这里声明;
Invoker 角色:调用者,接收到命令,并执行命令,例子中我这里项目经理就是这个角色;

命令模式比较简单,但是在项目中使用是非常频繁的,封装性非常好,因为它把请求方( Invoker)和执
行方( Receiver)分开了,扩展性也有很好的保障。但是,命令模式也是有缺点的,你看 Command 的子类没

demo 下载: http://pan.baidu.com/s/1miDLdG0

引用:23种设计模式 作者 cbf4Life

1 0