【C++】设计模式:观察者、策略、模板

news2024/12/23 3:33:25

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍设计模式:观察者、策略、模板。
学其所用,用其所学。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞

文章目录

    • :smirk:1. 观察者模式
    • :blush:2. 策略模式
    • :satisfied:3. 模板方法

😏1. 观察者模式

观察者模式的基本原理,通过观察者模式可以实现对象之间的松耦合,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并作出相应的响应。

#include <iostream>
#include <vector>

// 观察者基类
class Observer {
public:
    virtual void update(int data) = 0;
};

// 具体观察者类 A
class ConcreteObserverA : public Observer {
public:
    void update(int data) override {
        std::cout << "Concrete Observer A received data: " << data << std::endl;
    }
};

// 具体观察者类 B
class ConcreteObserverB : public Observer {
public:
    void update(int data) override {
        std::cout << "Concrete Observer B received data: " << data << std::endl;
    }
};

// 主题类
class Subject {
private:
    int data;
    std::vector<Observer*> observers;

public:
    void attach(Observer* observer) {
        observers.push_back(observer);
    }

    void setData(int newData) {
        data = newData;
        notify();
    }

    void notify() {
        for (Observer* observer : observers) {
            observer->update(data);
        }
    }
};

int main() {
    ConcreteObserverA observerA;
    ConcreteObserverB observerB;

    Subject subject;
    subject.attach(&observerA);
    subject.attach(&observerB);

    subject.setData(100);

    return 0;
}

😊2. 策略模式

策略模式是一种行为设计模式,它允许在运行时选择算法的行为。定义一系列算法,把它们封装起来,并且使它们可以互相替换。策略模式可以使算法独立于使用它的客户端而变化。

#include <iostream>

// 策略接口
class Strategy {
public:
    virtual void execute() = 0;
};

// 具体策略 A
class ConcreteStrategyA : public Strategy {
public:
    void execute() override {
        std::cout << "Executing Concrete Strategy A" << std::endl;
    }
};

// 具体策略 B
class ConcreteStrategyB : public Strategy {
public:
    void execute() override {
        std::cout << "Executing Concrete Strategy B" << std::endl;
    }
};

// 上下文类
class Context {
private:
    Strategy* strategy;

public:
    Context(Strategy* s) : strategy(s) {}

    void setStrategy(Strategy* s) {
        strategy = s;
    }

    void executeStrategy() {
        strategy->execute();
    }
};

int main() {
    ConcreteStrategyA strategyA;
    ConcreteStrategyB strategyB;

    Context context(&strategyA);
    context.executeStrategy();

    context.setStrategy(&strategyB);
    context.executeStrategy();

    return 0;
}

😆3. 模板方法

模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。这样可以使子类在不改变算法结构的情况下重新定义某些步骤。

#include <iostream>

// 抽象类定义模板方法
class AbstractClass {
public:
    // 模板方法定义了算法的骨架
    void templateMethod() {
        step1();
        step2();
        step3();
    }

    virtual void step1() = 0; // 子类必须实现的步骤1
    virtual void step2() = 0; // 子类必须实现的步骤2

    void step3() {
        std::cout << "Abstract step3" << std::endl;
    }
};

// 具体子类实现具体步骤
class ConcreteClassA : public AbstractClass {
public:
    void step1() override {
        std::cout << "ConcreteClassA step1" << std::endl;
    }

    void step2() override {
        std::cout << "ConcreteClassA step2" << std::endl;
    }
};

class ConcreteClassB : public AbstractClass {
public:
    void step1() override {
        std::cout << "ConcreteClassB step1" << std::endl;
    }

    void step2() override {
        std::cout << "ConcreteClassB step2" << std::endl;
    }
};

int main() {
    AbstractClass* a = new ConcreteClassA();
    AbstractClass* b = new ConcreteClassB();

    a->templateMethod();
    b->templateMethod();

    delete a;
    delete b;

    return 0;
}

通过模板方法模式,我们可以在父类中定义一个算法的骨架,而将具体实现延迟到子类中,从而实现代码复用和扩展。

请添加图片描述

以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1500152.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最长上升子序列c++

题目 输入样例&#xff1a; 7 3 1 2 1 8 5 6输出样例&#xff1a; 4 思路 题目求最大长度&#xff0c;考虑使用DP来做。我们从状态表示和状态计算两方面进行分析。 假设用a数组来存序列&#xff0c;f数组来存以f[i]结尾的最长上升子序列。 1. 状态表示&#xff1a; 这一步…

找不到msvcr100.dll怎么办,五种有效解决msvcr100.dll丢失的方法

由于系统中关键文件msvcr100.dll的缺失&#xff0c;用户可能会遭遇一系列始料未及的困扰与问题。msvcr100.dll是Microsoft Visual C运行库中的一个核心动态链接库文件&#xff0c;对于许多应用程序的正常运行至关重要。当这个特定的dll文件丢失时&#xff0c;可能会导致部分软件…

电脑如何快速生成图片二维码?在线图片生码的制作步骤

多张图片在电脑上如何生成二维码之后预览呢&#xff1f;现在很多场景下都会发现扫码会展现很多的图片&#xff0c;通过手机来获取图片内容&#xff0c;那么图片放入二维码中的制作方法是什么样的呢&#xff1f;下面就通过本篇文章来给大家介绍图片二维码在线制作的方法及步骤&a…

SpringBoot+Ajax+redis实现隐藏重要接口地址

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》《项目实战》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 …

测试常用的Linux命令

前言 直接操作硬件 将把操作硬件的代码封装成系统调用&#xff0c;供程序员使用 虚拟机软件 可以模拟的具有完整硬件系统的功能 可以在虚拟机上安装不同的操作系统 Linux内核只有一个&#xff0c;发行版有很多种 内核来运行程序和管理像磁盘和打印机等硬件设备的核心程序 终端…

JumpServer 简介安装

目录 1、概念介绍 JumpServer 概述 JumpServer 功能 JumpServer 组件 JumpServer 架构 2、前置安装 环境要求 安装 ELRepo 库 更新内核 设置 grub2 安装 Python 配置 Python 虚拟环境 3、安装 Jumpserver Core 组件 下载安装 替换客户端组件 安装 Python 依赖库…

基于树莓派4B的智能家居系统设计

目录 一、项目介绍 二、前期准备 1.硬件准备 2.开发环境 三、C语言的简单工厂模式 1.工厂模式介绍 2.类和对象 3.工厂模式的优缺点 四、树莓派的基本使用 1.树莓派刷机和登入 2.树莓派WiringPi库介绍 3.树莓派 CSI 摄像头配置 4.树莓派与其他模块接线 五、智能家居…

【Java】生成条形码工具类

报销单需要根据单号生成条形码 先看效果图 直接上代码&#xff0c;复制即可使用 /*** Description:生成条形码*/ public class BarCodeUtils {/*** 默认图片宽度*/private static final int DEFAULT_PICTURE_WIDTH 300;/*** 默认图片高度*/private static final int DEFAULT_…

【C++杂货铺】详解string

目录 &#x1f308;前言&#x1f308; &#x1f4c1; 为什么学习string &#x1f4c1; 认识string&#xff08;了解&#xff09; &#x1f4c1; string的常用接口 &#x1f4c2; 构造函数 &#x1f4c2; string类对象的容量操作 &#x1f4c2; string类对象的访问以及遍历操…

智慧油气场站:油气行业实现数字化转型的关键一步

智慧油气场站&#xff1a;油气行业实现数字化转型的关键一步 在现代社会&#xff0c;能源供应是国家经济发展和人民生活的重要保障。而油气场站作为能源的重要供应和储存基地&#xff0c;扮演着至关重要的角色。此外&#xff0c;油气场站还可以为石油和天然气的生产提供支持。…

前端手册-实现挂坠灯笼效果

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

网红老阳推荐的蓝海项目,视频号带货怎么样?有优势吗?

老阳是一位在互联网创业领域颇具影响力的任务&#xff0c;他经常会在自己的社交媒体平台上分享一些他认为有潜力的蓝海项目和创业机会。近期&#xff0c;老阳推荐了一个备受关注的蓝海项目——视频号带货。那么&#xff0c;这个项目究竟怎么样呢?我们来分析一下。 首先&#x…

TypeScript 基础(一)

目录 一、概述 二、开发环境 三、数据类型 1.boolean 2.number 3.string 4.Array 5.type 6.tuple 7.enum 8.any 9.null / undefined 10.never 11.object 结束 一、概述 TypeScript 是一种由微软开发的开源编程语言。它是 JavaScript 的一个超集&#xff0c;这意…

【排序算法】推排序算法解析:从原理到实现

目录 1. 引言 2. 推排序算法原理 3. 推排序的时间复杂度分析 4. 推排序的应用场景 5. 推排序的优缺点分析 5.1 优点&#xff1a; 5.2 缺点&#xff1a; 6. Java、JavaScript 和 Python 实现推排序算法 6.1 Java 实现&#xff1a; 6.2 JavaScript 实现&#xff1a; 6.…

使用langchain搭建本地知识库系统(新)

使用langchain搭建自己的本地知识库系统&#xff08;新&#xff09; 前些时候字节上了自己的扣子&#xff0c;用来构建我们自己的 agent [AI 实战&#xff1a;手把手教你使用「扣子/coze」来搭建个人blog知识库 受到启发&#xff0c;想在本地或者自己的服务器上面搭建一个知识…

震惊!性能一下子提升10倍,用Performance面板分析性能瓶颈全流程!

工作中发现了一个下拉框打开的数据比较慢&#xff0c;并且打开弹框的时候会有相当长一段时间的延迟&#xff0c;下拉的弹框不是使用组件库的&#xff0c;而是自己封装的一个组件&#xff0c;怀疑存在数据量过大影响的情况&#xff0c;所以借助性能分析工具来找出具体的原因。 如…

渲染农场与并行处理:大规模渲染任务的高效解决方案

随着数字技术与计算机图形学的突飞猛进&#xff0c;大规模渲染任务已成为电影制作、游戏开发、建筑设计以及科学计算等诸多行业的常态化需求。面对这些日益增长的需求&#xff0c;渲染农场与并行处理技术凭借其卓越的效率和精准度&#xff0c;已然成为应对这些挑战的核心高效解…

bigemap在水利科学研究院是如何应用的?

使用场景&#xff1a; 1.数据采集&#xff1a;客户主要是做科研方向的&#xff0c;前期的工作内容就是野外调查使用Bigemap APP去采集点位数据回传到电脑上&#xff0c;电脑端再进行查看分类、二次编辑标注和统计数据。 2.矢量处理&#xff1a;客户其他部门用GPS采集回来的项目…

YUNBEE-腾讯云TDSQL MySQL和PostgreSQL TCA初级认证考试

腾讯云TDSQL(MySQL版)‍ TCA 数据库交付运维工程师-腾讯云TDSQL(MySQL版) - 课程体系 - 云贝教育 (yunbee.net) 培训概述 数据库交付运维工程师-腾讯云TDSQL&#xff08;MySQL版&#xff09;培训&#xff0c;将通过理论与上机演练相结合的方式&#xff0c;以腾讯分布式OLTP数…

波卡 Alpha 计划启动,呼唤先锋创新者重新定义 Web3 开发

原文&#xff1a;https://polkadot.network/blog/the-polkadot-alpha-program-a-new-era-for-decentralized-building-collaboration/ 编译&#xff1a;OneBlock 区块链领域不断发展&#xff0c;随之而来的是发展和创新机会的增加。而最新里程碑是令人振奋的 Polkadot Alpha …