设计模式:命令模式

模式概述

命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。

命令模式将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。

命令模式扩展性良好,增加或删除命令非常方便。采用命令模式增加与删除命令不会影响其他类,且满足“开闭原则”。可以在现有命令的基础上,增加额外功能。比如日志记录,结合装饰器模式会更加灵活。方便实现 Undo 和 Redo 操作。命令模式可以与后面介绍的备忘录模式结合,实现命令的撤销与恢复。可以实现宏命令。命令模式可以与组合模式结合,将多个命令装配成一个组合命令,即宏命令。

模式结构

命令模式包含四个部分:

抽象命令类角色:声明执行命令的接口,拥有执行命令的抽象方法 execute()。
具体命令类角色:是抽象命令类的具体实现类,它拥有接收者对象,并通过调用接收者的功能来完成命令要执行的操作。
实现者/接收者角色:执行命令功能的相关操作,是具体命令对象业务的真正实现者。
调用者/请求者角色:是请求的发送者,它通常拥有很多的命令对象,并通过访问命令对象来执行相关请求,它不直接访问接收者。

在这里插入图片描述

实现代码

假设形状Shape分为Circle和Square两种,我们想通过一个调用器ShapeInvoker来调用具体的形状绘画器CircleReceiver、SquareReceiver完成形状的绘制。在这种情况下,这里的Circle、Square就相当于命令,绘画器就相当于接收者。实现代码如下:

抽象命令类角色
public interface Shape {
    public abstract void draw();
}
具体命令类角色
public class Circle implements Shape{
    private CircleReceiver circleReceiver;

    public Circle(){
        this.circleReceiver = new CircleReceiver();
    }
    @Override
    public void draw() {
        this.circleReceiver.draw();       
    }
}
public class Square implements Shape{
    private SuqareReceiver suqareReceiver;

    public Square(){
        this.suqareReceiver = new SuqareReceiver();
    }
    @Override
    public void draw() {
        suqareReceiver.draw();        
    }
}
实现者/接收者角色
public class CircleReceiver {
    public void draw(){
        System.out.println("circle");
    }
}
public class SuqareReceiver {
    public void draw(){
        System.out.println("square");
    }
}
调用者/请求者角色
public class ShapeInvoker {
    private Shape circle;
    private Shape square;

    public void setCircle(Circle circle){
        this.circle = circle;
    }
    public void setSquare(Square square){
        this.square = square;
    }
    public void chooseCircle(){
        this.circle.draw();
    }
    public void chooseSquare(){
        this.square.draw();
    }
}
测试类(客户端)
public class Demo {
    public static void main(String[] args) {
        Shape circle = new Circle();
        Shape square = new Square();
        ShapeInvoker shapeInvoker = new ShapeInvoker();
        
        shapeInvoker.setCircle((Shape)circle);
        shapeInvoker.setSquare((Shape)square);
        shapeInvoker.chooseCircle();
        shapeInvoker.chooseSquare();
    }
}

输出为:

circle
square
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不负韶华ღ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值