设计模式-行为型模式-命令模式

简介:

设计模式-行为型模式-命令模式

基础

以一个MIS系统为栗子

MIS 管理信息系统(Management Information System,MIS)是一个以人为主导的,利用计算机硬件、软件和网络设备,进行信息的收集、传递、存储、加工、整理的系统,以提高组织的经营效率。

代码如下

public abstract class Group{
    // 甲乙双方公开办公,如果要和某个组讨论,要先找到这个组
    public abstract void find();
    // 要求增加功能
    public abstract void add();
    // 删除功能
    public abstract void delete();
    // 被要求修改功能
    public abstract void change();
    // 被要求给出变更计划
    public abstract void plan();
}

抽象类中的都是命令方式。
进行需求组

public class RequirementGroup extends Group{
    // 客户要求需求进行更改
    public void find(){
        
    }
    // 客户要求增加需求
    public void add(){
    }
    // 客户要求修改需求
    public void change(){
    }
    // 客户要求删除需求
    public void delete(){
    }
    // 客户要求给出变更计划
    public void plan(){
    }
}
// 美工组
public class PageGroup extends Group{
    // 找到美工组
    public void find(){
    }
    // 客户要求增加页面
    public void add(){
    }
    // 客户要求对现有界面修改
    public void change(){
    }
    // 客户要求删除页面
    public void delete(){
    }
    // 给出计划
    public void plan(){
    }
}
// 代码组
public class CodeGroup extends Group {
    // 客户要求过去谈
    public void find(){
    }
    // 客户要求增加功能
    public void add(){
    }
    // 客户要求修改功能
    public void change(){
    }
    // 客户要求删除功能
    public void delete(){
    }
    // 客户要求变更计划
    public void plan(){
    }
}

最后书写场景类

// 场景类
public class Client{
    public static void main(String[] args){
        // 客户找到需求要求谈需求进行修改
        Grop rg = new RequirementGroup();
        // 找到需求组
        rg.find();
        // 增加需求组
        rg.add();
        // 变更计划
        rg.plan();
    }
}

此时客户要求多一个界面

public class Client {
    public static void main(String[] args){
        Group pg = new PangeGroup();
        // 找到需求组
        pg.find();
        // 删除需求组
        pg.delete();
        // 需求变更
        pg.plan();
    }
}

变更

客户每次都要单独找一个,非常复杂,设置一个负责人,负责和客户和需求,美工之间的连接。

// 抽象出命令类
public abstract class Command{
    // 定义三个组,确保子类可以直接使用
    protected RequirementGroup rg = new RequirementGroup();    // 需求组
    protected PageGroup pg = new PageGroup();    // 美工组
    protected CodeGroup cg = new CodeGroup(); // 代码组
    public abstract void execute();    // 做什么事情
}

增加需求的命令

public class AddRequirementCommand extends  Command{
    // 增加一项需求命令
    public void execute(){
        // 找到需求组
        super.rg.find();
        // 增加一份需求
        super.rg.add();
        // 给出计划
        super.rg.plan();
    }
}

增加删除页面的命令

public class DeletePageCommand extends Command{
    public void execute(){
        // 找到页面组
        super.pg.find();
        // 删除页面
        super.rg.delete();
        // 给出计划
        super.rg.plan();
    }
}

最后再将这也命令封装,成一个负责人

public class invoker {
    // 命令
    private Command command;
    // 客户发出命令
    public void setCommand(Command command){
        this.command = command;
    }
    // 客户自行命令
    public void action(){
        this.command.execute();
    }
}

最后场景类如下

public class Client{
    public static void main(String[] args){
        // 定义接头人
        invoker xiaoSan = new Invoker();    // 接头人
        // 客户增加需求
        // 客户下命令
        Command command = new AddRequirementCommand();
        // 街头人收到命令
        xiaoSan.setCommand(command);
        // 街头人执行命令
        xiaoSan.action();
    }
}

继续更改

由于负责人的抽象类中声明了所有的,所以可以分离
代码如下

public abstract class Command {
    // 定义子类全局共享变量
    protected final Receiver receiver;
    // 实现类名需要接收
    public Command(Receiver _receiver){
        this.receiver = _receiver;
    }
    // 每个命令需要有执行
    public abstract void execute();
}

然后在Command中声明接收者。
通过构造函数指定

public class ConcreteCommand1 extends Command{
    // 声明自己默认接收者
    public ConcreteCommand1(){
        super(new ConcreteReciver1());
    }
    // 设置新的接受
    public ConcreteCommand1(Receiver _receiver){
        super(_receiver);
    }
    // 处理
    public void execute(){
        super.receiver.doSomething();
    }
}
// 声明场景
public class Client{
    public static void main(String[] args){
        invoker invoker = new invoker();
        // 定义要发送的命令
        Command command = new ConcreteCommand1();
        invoker.setCommand(command);
        invoker.action();
    }
}

总结

将需求封装成命令,然后再负责人当中封装,最后,需要的时候,直接调用负责人,将命令传入进去即可。

目录
相关文章
|
4月前
|
设计模式 UED
二十三种设计模式:解锁软件开发的神器:命令模式与撤销重做功能
二十三种设计模式:解锁软件开发的神器:命令模式与撤销重做功能
|
3月前
|
设计模式 前端开发 算法
【面试题】 ES6 类聊 JavaScript 设计模式之行为型模式(二)
【面试题】 ES6 类聊 JavaScript 设计模式之行为型模式(二)
|
3月前
|
设计模式 算法
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
39 1
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
|
18天前
|
设计模式 Java
23种设计模式,命令模式的概念优缺点以及JAVA代码举例
【4月更文挑战第7天】命令模式是一种行为设计模式,它将请求或简单操作封装为一个对象。这种模式允许用户通过调用对象来参数化其他对象的方法,并能保存、排队和执行方法调用。
21 1
|
1月前
|
设计模式 存储 算法
Java设计模式---行为型模式
Java设计模式---行为型模式
|
1月前
|
设计模式 存储 Java
【设计模式】命令模式
【设计模式】命令模式
|
3月前
|
设计模式 Java
设计模式-命令模式
设计模式-命令模式
33 1
|
3月前
|
设计模式 Java
设计模式-命令模式(Command)
设计模式-命令模式(Command)
32 0
|
3月前
|
设计模式 存储 Java
Java设计模式-命令模式
命令(Command)模式是指将请求封装成为一个对象,使发出请求和执行请求的责任分割开,方便将命令对象进行存储、传递、调用、增加与管理。 也就是将发送者、接收者和调用命令封装成独立的对象,来供客户端调用。属于行为模式的一种。
29 1
Java设计模式-命令模式
|
3月前
|
设计模式 Go 开发工具
Golang设计模式——06命令模式
Golang设计模式——06命令模式
20 0