设计模式之委托模式

委托设计模式(Delegate Pattern)是一种行为设计模式,它允许一个对象将某些责任委托给另一个对象。在委托模式中,有两个主要角色:委托者(Delegator)和被委托者(Delegate)。委托者将任务委托给被委托者,而被委托者负责执行这些任务。

主要角色:

  1. 委托者(Delegator)
    • 接受客户端的请求。
    • 将请求委托给被委托者。
    • 可以有自己的行为,也可以仅仅是将请求转发。
  2. 被委托者(Delegate)
    • 负责执行具体的任务。
    • 可以是接口或者抽象类,使得委托者可以委托不同的实现。

优点:

  • 解耦:委托者和被委托者之间的解耦,使得它们可以独立变化。
  • 扩展性:可以很容易地添加新的被委托者,从而扩展功能。
  • 灵活性:委托者可以根据需要动态地改变被委托者。

缺点:

  • 复杂性:可能会增加系统的复杂性,因为需要维护委托关系。
  • 性能开销:委托可能会引入一些额外的性能开销。

实现步骤:

  1. 定义被委托者接口或抽象类。
  2. 实现具体的被委托者类。
  3. 定义委托者类,并在其中包含一个被委托者的引用或指针。
  4. 委托者将任务转发给被委托者。

示例:

下面是一个简单的委托模式实现示例:

cpp 复制代码
#include <iostream>
#include <string>
// 被委托者接口
class Printer {
public:
    virtual void print(std::string message) = 0;
    virtual ~Printer() {}
};
// 具体的被委托者实现
class ConsolePrinter : public Printer {
public:
    void print(std::string message) override {
        std::cout << "ConsolePrinter: " << message << std::endl;
    }
};
// 另一个被委托者实现
class FilePrinter : public Printer {
public:
    void print(std::string message) override {
        std::cout << "FilePrinter: " << message << " (saved to file)" << std::endl;
    }
};
// 委托者
class PrintManager {
private:
    Printer* printer; // 持有被委托者的引用
public:
    PrintManager(Printer* p) : printer(p) {}
    void setPrinter(Printer* p) {
        printer = p;
    }
    void print(std::string message) {
        if (printer != nullptr) {
            printer->print(message); // 委托给被委托者
        }
    }
};
int main() {
    ConsolePrinter consolePrinter;
    FilePrinter filePrinter;
    PrintManager manager(&consolePrinter);
    manager.print("Hello World!");
    // 更改被委托者
    manager.setPrinter(&filePrinter);
    manager.print("Hello File!");
    return 0;
}

在这个例子中,PrintManager 是委托者,它将打印任务委托给 ConsolePrinterFilePrinter。通过这种方式,PrintManager 可以在不改变自身代码的情况下,灵活地改变打印行为。

注意,这里用到了多态。在提供的代码示例中,Printer* printer; 这一行声明了一个指向 Printer 类型的指针,这是一个抽象基类。多态在这里体现在以下几个方面:

  1. 基类指针指向派生类对象
    • Printer* printer; 可以指向任何继承自 Printer 的派生类对象,如 ConsolePrinterFilePrinter
  2. 虚函数
    • Printer 类中定义了一个虚函数 void print(std::string message);,这意味着在派生类中可以对这个函数进行重写(override)。
  3. 动态绑定
    • 当通过基类指针调用 print 方法时,会根据对象的实际类型来调用相应的派生类中的重写函数。这是运行时多态的体现。
      main 函数中,以下代码展示了多态的使用:
cpp 复制代码
ConsolePrinter consolePrinter;
FilePrinter filePrinter;
PrintManager manager(&consolePrinter);
manager.print("Hello World!");
// 更改被委托者
manager.setPrinter(&filePrinter);
manager.print("Hello File!");

在这里,PrintManagerprint 方法通过基类指针 printer 调用 print 函数。由于 printer 指向的是 ConsolePrinter 对象,第一次调用 print 时,会调用 ConsolePrinterprint 方法。当 printer 被设置为指向 FilePrinter 对象时,再次调用 print 方法,则会调用 FilePrinterprint 方法。这就是多态的动态绑定行为。

相关推荐
用户9385156350713 小时前
工厂模式与 Nest.js 核心思想 —— 从蜜雪冰城到企业级架构
后端·设计模式·nestjs
烬羽17 小时前
从 nest new 到 Hello World:一个最小 NestJS 项目,讲透工厂 + 装饰器 + 模块化
设计模式·node.js·nestjs
艺艺生辉2 天前
从if-else到策略模式
后端·设计模式
小林ixn2 天前
单例模式:从弹窗管理到全局状态,一个模式搞定
前端·javascript·设计模式
AI人工智能+电脑小能手2 天前
大白话说Java设计模式-17-装饰器模式(源码剖析篇)
java·spring·设计模式·装饰器模式·源码分析·io流
workflower2 天前
案例 :某交通厅基于AI技术的智能安全运营实践
网络·人工智能·安全·设计模式·机器人
AI人工智能+电脑小能手2 天前
大白话说Java设计模式-16-装饰器模式(业务实战篇)
java·设计模式·装饰器模式·功能扩展·动态增强
workflower3 天前
例二:某汽车制造企业深度融合AI智能体,构建园区网络的智能运维体系
人工智能·机器学习·设计模式·机器人·云计算·汽车·制造
ly76893 天前
Java 设计模式详解:从原则到 23 种经典模式
java·开发语言·设计模式
AI人工智能+电脑小能手3 天前
大白话说Java设计模式-14-适配器模式(业务实战篇)
java·设计模式·适配器模式·系统兼容·多渠道对接