• 设计模式 -- 命令模式(Command Pattern)


    命令模式:一种数据驱动的设计模式也属于行为型模式,请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。你认为是命令的地方都可以使用命令模式。

    介绍
    • 意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。
    • 主要解决问题:行为请求者与行为实现者的关系紧耦合,将"行为请求者""行为实现者"解耦,通过调用者调用接受者执行命令,顺序:调用者接受者命令。
    • 关键代码:定义三个角色,命令、接受者、调用者
    • 优点:1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。
    • 缺点:使用命令模式可能会导致某些系统有过多的具体命令类
    示例

    还是以绘制三角形、圆形、矩形为例:

    1. 创建一个绘制命令接口(抽象命令)
      1. //抽象命令
      2. public interface Drawing {
      3. void execute();
      4. }
    2. 接收者(接收 绘制方法
      1. //接收者
      2. public class Draw {
      3. public void triangle(){
      4. //绘制三角形逻辑
      5. }
      6. public void circular(){
      7. //绘制圆形逻辑
      8. }
      9. public void rectangle(){
      10. //绘制矩形逻辑
      11. }
      12. }
    3. 具体命令
      绘制三角形具体命令
      1. //具体绘制三角形命令
      2. public class TriangleDraw implements Drawing {
      3. Draw draw;
      4. public TriangleDraw(Draw draw) {
      5. this.draw = draw;
      6. }
      7. @Override
      8. public void execute() {
      9. draw.triangle();
      10. }
      11. }
      绘制圆形具体命令
      1. //具体绘制圆形命令
      2. public class CircularDraw implements Drawing{
      3. Draw draw;
      4. public CircularDraw(Draw draw) {
      5. this.draw = draw;
      6. }
      7. @Override
      8. public void execute() {
      9. draw.circular();
      10. }
      11. }
      绘制矩形具体命令
      1. //具体绘制矩形命令
      2. public class RectangleDraw implements Drawing{
      3. Draw draw;
      4. public RectangleDraw(Draw draw) {
      5. this.draw = draw;;
      6. }
      7. @Override
      8. public void execute() {
      9. draw.rectangle();
      10. }
      11. }
    4. 使用
      1. //使用示例
      2. public static void main(String[] args) {
      3. Draw draw = new Draw();
      4. TriangleDraw triangleDraw = new TriangleDraw(draw);
      5. CircularDraw circularDraw = new CircularDraw(draw);
      6. RectangleDraw rectangleDraw = new RectangleDraw(draw);
      7. Canvas canvas = new Canvas();
      8. canvas.takeDrawing(triangleDraw);
      9. canvas.takeDrawing(circularDraw);
      10. canvas.takeDrawing(rectangleDraw);
      11. canvas.call();
      12. }

  • 相关阅读:
    部署Jenkins服务或者SVN服务。提交操作步骤及截图
    【工具】精通Chrome浏览器:Windows和Mac的快捷键指南
    中国网络安全审查认证和市场监管大数据中心数据合规官CCRC-DCO
    CPP-Templates-2nd--第十九章 萃取的实现 19.7---
    数据库篇:mysql事务原理之MVCC视图+锁
    HTB靶场之Sandworm
    更改系统时区为东八区
    git常用操作,脱离可视化操作,命令执行更方便
    C++ STL中vector、list、deque顺序容器使用介绍
    Github每日精选(第60期):使用 HTML5 画布从 DOM 节点生成图像html-to-image
  • 原文地址:https://blog.csdn.net/qq_50675668/article/details/134306284