设计模式——模板方法模式

embedded/2024/11/20 8:15:28/

定义一个操作中的算法框架,而将一些步骤延迟到子类中,模版方法模式使得子类可以不改变算法结构即可重新定义算法的某些特定步骤

1.优点:
在父类中定义一个算法,而右它的子类来实现细节处理,在子类实现详细的处理算法并不会改变算法中步骤的执行顺序
模版方法模式是一种代码复用技术,他在类库中设计特别重要,它提取了类库中的公共行为,将公共行为放在父类,而通过其他子类来实现不同的行为,它鼓了我们恰当使用继承来实现代码复用
可实现一种反向控制结构,通过子类覆盖父类的钩子方法来决定是否需要执行
在模版方法模式中可以通过子类来覆盖父类的基本方法,不同子类可以提供基本方法的不同实现,更换和增加新的子类很方便,符合单一职责和开闭原则

2.缺点
灵活性较低:模板方法模式强制子类遵循父类定义的算法结构,子类只能在有限的步骤上进行扩展,难以完全改变算法的结构。
高耦合性:模板方法模式可能导致父类和子类之间的耦合性较高,任何对父类的修改都有可能影响到所有子类,从而增加了维护的难度。

#include<iostream>
using namespace std;class DrinkTemplate
{
public:virtual void BolidWater()=0;virtual void Brew()=0;virtual void PourCup()=0;virtual  void AddSomething()=0;void Make(){BolidWater();Brew();PourCup();AddSomething();}
};class Coffee:public DrinkTemplate
{
public:virtual void Brew(){cout<<"冲泡咖啡"<<endl;	}virtual void BolidWater(){cout<<"煮水"<<endl;	}virtual void PourCup(){cout<<"咖啡倒入杯子中"<<endl;	}virtual  void AddSomething(){cout<<"加糖,加牛奶"<<endl;	}
};class Tea: public DrinkTemplate
{
public:virtual void BolidWater(){cout<<"煮水"<<endl;	}virtual void Brew(){cout<<"冲泡铁观音"<<endl;	}virtual void PourCup(){cout<<"茶倒入杯子中"<<endl;	}virtual  void AddSomething(){cout<<"加蜂蜜"<<endl;	}};void test()
{Tea * tea=new Tea;tea->Make();cout<<"  "<<endl;		Coffee *coffee=new Coffee;coffee->Make();}int main()
{test();return 0;	
}


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

相关文章

Ascend C算子性能优化实用技巧05——API使用优化

Ascend C是CANN针对算子开发场景推出的编程语言&#xff0c;原生支持C和C标准规范&#xff0c;兼具开发效率和运行性能。使用Ascend C&#xff0c;开发者可以基于昇腾AI硬件&#xff0c;高效的实现自定义的创新算法。 目前已经有越来越多的开发者使用Ascend C&#xff0c;我们…

梯度消失和梯度爆炸

梯度消失与梯度爆炸 这两个问题通常在深度神经网络中出现&#xff0c;特别是在反向传播过程中&#xff0c;会严重影响网络的训练效果。 1. 梯度消失&#xff08;Vanishing Gradient&#xff09; 现象 在反向传播时&#xff0c;梯度值逐层减小&#xff0c;导致靠近输入层的权…

用 Python 从零开始创建神经网络(五):损失函数(Loss Functions)计算网络误差

用损失函数&#xff08;Loss Functions&#xff09;计算网络误差 引言1. 分类交叉熵损失&#xff08;Categorical Cross-Entropy Loss&#xff09;2. 分类交叉熵损失类&#xff08;The Categorical Cross-Entropy Loss Class&#xff09;展示到目前为止的所有代码3. 准确率计算…

Android从Drawable资源Id直接生成Bitmap,Kotlin

Android从Drawable资源Id直接生成Bitmap,Kotlin val t1 System.currentTimeMillis()val bmp getBmpFromDrawId(this, R.mipmap.ic_launcher_round)Log.d("fly", "1 ${bmp?.byteCount} h${bmp?.height} w${bmp?.width} cost time${System.currentTimeMillis…

from sklearn.preprocessing import Imputer.处理缺失数据的工具

在 Python 的 scikit-learn 库中&#xff0c;Imputer 类是一个用于处理缺失数据的工具。它可以用来填充数据集中的缺失值&#xff08;通常表示为 NaN 或 None&#xff09;。Imputer 类提供了几种不同的填充策略&#xff0c;包括&#xff1a; 均值填充&#xff08;mean&#xf…

Spring Cloud Alibaba [Gateway]网关。

1 简介 网关作为流量的入口&#xff0c;常用功能包括路由转发、权限校验、限流控制等。而springcloudgateway 作为SpringCloud 官方推出的第二代网关框架&#xff0c;取代了Zuul网关。 1.1 SpringCloudGateway特点: &#xff08;1&#xff09;基于Spring5&#xff0c;支持响应…

微服务网关聚合swagger(knife4j版本)

前言 简单集成&#xff0c;最小的依赖及配置&#xff0c;采取默认为主 步骤 依赖<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-gateway-spring-boot-starter</artifactId><version>4.4.0</version> &…

面向对象编程的局限性与适用场景分析

文章目录 1. 性能敏感的应用2. 简单的脚本或小型程序3. 资源受限的环境4. 高并发场景5. 功能单一的应用6. 需要高度定制化和灵活性的应用7. 数据密集型计算8. 需要严格控制内存的应用结论 1. 性能敏感的应用 限制原因&#xff1a; 对象实例化开销&#xff1a;面向对象编程中&…