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

简介:

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

基础

以一个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();
    }
}

总结

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

目录
相关文章
|
9月前
|
设计模式 网络协议 Java
【设计模式】【行为型模式】状态模式(State)
一、入门 什么是状态模式? 状态模式(State Pattern)是一种行为设计模式,允许对象在其内部状态改变时改变其行为,使其看起来像是改变了类。状态模式的核心思想是将对象的状态封装成独立的类,并将
376 16
|
9月前
|
设计模式 算法 前端开发
【设计模式】【行为型模式】职责链模式(Chain of Responsibility)
一、入门 什么是职责链模式? 职责链模式是一种行为设计模式,它允许你将请求沿着一条链传递,直到有对象处理它为止。每个对象都有机会处理请求,或者将其传递给链中的下一个对象。 为什么需要职责链模式? 使用
352 16
|
9月前
|
设计模式 存储 Java
【设计模式】【行为型模式】备忘录模式(Memento)
一、入门 什么是备忘录模式? 备忘录模式(Memento Pattern)是一种行为设计模式,用于在不破坏封装性的前提下,捕获并外部化一个对象的内部状态,以便在需要时恢复该状态。它通常用于实现撤销操作
312 8
|
9月前
|
设计模式 消息中间件 Java
【设计模式】【行为型模式】命令模式(Command)
一、入门 什么是命令模式? 命令模式是一种行为设计模式,它将请求或操作封装为对象,从而使你可以用不同的请求对客户进行参数化,并支持请求的排队、记录、撤销等操作。 命令模式的核心是将“请求”封装为独立的
279 15
|
9月前
|
设计模式 算法 搜索推荐
【设计模式】【行为型模式】策略模式(Strategy)
一、入门 什么是策略模式? 策略模式是一种行为设计模式,允许在运行时选择算法或行为。它将算法封装在独立的类中,使得它们可以互换,而不影响客户端代码。 为什么需要策略模式? 策略模式的主要目的是解决算法
201 14
|
9月前
|
设计模式 数据采集 算法
【设计模式】【行为型模式】模板方法模式(Template Method)
一、入门 1.1、什么是模板方法模式? 模板模式(Template Method Pattern)是一种行为设计模式,它定义了一个算法的框架,并允许子类在不改变算法结构的情况下重新定义算法的某些步骤。
296 13
|
9月前
|
设计模式 Java 编译器
【设计模式】【行为型模式】解释器模式(Interpreter)
一、入门 什么是解释器模式? 解释器模式(Interpreter Pattern)是一种行为设计模式,用于定义语言的语法表示,并提供一个解释器来处理该语法。它通常用于需要解释和执行特定语言或表达式的场
225 11
|
9月前
|
设计模式 存储 JavaScript
【设计模式】【行为型模式】迭代器模式(Iterator)
一、入门 什么是迭代器模式? 迭代器模式(Iterator Pattern)是一种行为设计模式,它提供了一种顺序访问聚合对象中元素的方法,而不需要暴露其底层表示。迭代器模式将遍历逻辑从聚合对象中分离出
259 11
|
9月前
|
设计模式 XML JSON
【设计模式】【行为型模式】访问者模式(Visitor)
一、入门 什么是访问者模式? 访问者模式(Visitor Pattern)是一种行为设计模式,允许你将算法与对象结构分离。通过这种方式,可以在不改变对象结构的情况下,向对象结构中的元素添加新的操作。
300 10
|
9月前
|
设计模式 Java 程序员
【设计模式】【行为型模式】中介者模式(Mediator)
一、入门 什么是中介者模式? 中介者模式(Mediator Pattern)是一种行为设计模式,旨在减少对象之间的直接依赖,通过引入一个中介者对象来协调多个对象之间的交互。这种模式特别适用于对象间存在
234 9