设计模式之委托模式

embedded/2024/10/19 0:22:21/

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

主要角色:

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

优点:

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

缺点:

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

实现步骤:

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

示例:

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

#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 函数中,以下代码展示了多态的使用:
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 方法。这就是多态的动态绑定行为。


http://www.ppmy.cn/embedded/128592.html

相关文章

【Java 并发编程】线程池理解与使用

前言 在进入本章的学习之前&#xff0c;先来回顾一下&#xff0c;在没有使用线程池一直是如何执行任务的&#xff1a; class Task implements Runnable{Overridepublic void run() {System.out.println(Thread.currentThread().getName());} }class Main{public static void ma…

利用编程思维做题之求节点 x 在二叉树中的双亲节点算法

在二叉树中查找某个节点 x 的双亲节点是一个典型的树操作问题。双亲节点的概念是指某个节点的直接上级节点&#xff0c;即它的父节点。我们将通过遍历树的结构&#xff0c;查找并返回 x 的双亲节点。 1. 理解问题 我们需要设计一个算法来查找给定二叉树中节点 x 的双亲节点。目…

spring Jdbc

--------------------------------SpringJdbc-------------------------------- 创建数据库 DROP DATABASE IF EXISTS studb; CREATE DATABASE studb; USE studb; CREATE TABLE student ( id INT PRIMARY KEY, NAME VARCHAR(50) NOT NULL, gender VARCHAR(10) NO…

Vue3新特性合集

Vue3 简介 ‌‌Vue 3‌ 是‌Vue.js的最新版本&#xff0c;它带来了许多改进和新的特性&#xff0c;旨在提供更好的性能、更强的类型支持以及更灵活的组件开发方式。Vue 3的推出是为了解决Vue 2中存在的一些限制&#xff0c;如响应式系统的限制和虚拟DOM的效率问题。Vue 3在多…

Dinky 字段模式演变 PIPELINE 同步MySQL到Doris

背景 用Dinky数据平台 FlinkCDC收集Mysql BinLog 至 Doris 搭建实时数仓 问题 用Dinky CDCSOURCE 字段模式演变 整库同步Mysql到Doris 字段新增删除不生效 组件信息 Flink 1.17 FlinkCDC 3.1 dinky 1.1 Doris 2.1.6 Mysql 8.0Dinky MySQLCDC 整库到 Doris需要的依赖 Flink/…

开发一个微信小程序要多少钱?

在当今数字化时代&#xff0c;微信小程序成为众多企业和个人拓展业务、提供服务的热门选择。那么&#xff0c;开发一个微信小程序究竟需要多少钱呢&#xff1f; 开发成本主要取决于多个因素。首先是功能需求的复杂程度。如果只是一个简单的信息展示小程序&#xff0c;功能仅限…

【C++标准模版库】unordered_map和unordered_set的介绍及使用

unordered_map和unordered_set 一.unordered_set1.unordered_set类的介绍2.unordered_set和set的使用差异 二.unordered_map1.unordered_map和map的使用差异 三.unordered_multimap/unordered_multiset四.unordered_map/unordered_set的哈希相关接口 一.unordered_set 1.unord…

Git 可视化的实现:提升版本控制体验的利器

Git 是目前最流行的分布式版本控制系统&#xff0c;广泛应用于软件开发和项目管理中。然而&#xff0c;对于许多人来说&#xff0c;Git 命令行操作可能有些复杂且难以直观理解&#xff0c;特别是当涉及到复杂的分支和合并操作时。为了更好地帮助开发者掌握 Git 的操作过程&…