模板模式:
个人认为模板模式可以很好的对不同类似对象复用,从而达到减少代码量和易于维护的目的。
书上是这么说的:在一个方法中定义算法骨架,而将一些步骤延迟到子类中,末班方法使得子类在不改变算法结构的情况下,重新定义算法中的某些步骤。
模板模式使用的原则------好莱坞原则 低层不调用高层 高层会调用低层
和依赖倒转原则,两者皆依赖于抽象相比有什么不同呢?
个人认为2者都是为了达到解耦的目的才存在的,而依赖倒转是设计类时的原则,好莱坞原则则是编程习惯或者是一种技巧吧 我觉得。
以下以制作DQ暴风雪冰激凌为例实现模板模式的过程:
Code
public abstract class MakeDQ
{
public void Make()
{
#region 模板必选项
SelectCup();
AddIceCream();
#endregion
#region 模板可选项
if (hook())
AddIngredient();
#endregion
#region 模板必选选项
Mix();
GiveToCustomer();
#endregion
}
#region 通用方法
/// <summary>
/// 添加主料
/// </summary>
private void AddIceCream()
{
Console.WriteLine("加入白奶冰激凌原料");
}
/// <summary>
/// 搅拌过程
/// </summary>
private void Mix()
{
Console.WriteLine("将冰激淋带杯子放入机器进行搅拌~~");
}
/// <summary>
/// 交付过程
/// </summary>
private void GiveToCustomer()
{
Console.WriteLine("将暴风雪冰激淋在客人面前倒置下下,交给客人!");
}
#endregion
#region 由子类来实现的抽象方法
/// <summary>
/// 选择杯子
/// </summary>
public abstract void SelectCup();
/// <summary>
/// 添加配料
/// </summary>
public abstract void AddIngredient();
#endregion
#region 可选项,由子类决定是否覆盖
/// <summary>
/// 这里是个钩子来说明可选项,如果要添加辅料,返回true就可以了哦
/// </summary>
/// <returns></returns>
public virtual bool hook()
{
return false;
}
#endregion
}
/// <summary>
/// 双倍抹茶大碗DQ冰激淋
/// </summary>
public class Mochadabei : MakeDQ
{
public override void SelectCup()
{
Console.WriteLine("服务生拿了个大瓦缸 -_-!");
}
public override void AddIngredient()
{
Console.WriteLine("添加了双份抹茶");
}
public override bool hook()
{
return true;
}
}
/// <summary>
/// 小白杯DQ,不加辅料
/// </summary>
public class Xiaobaibei : MakeDQ
{
public override void SelectCup()
{
Console.WriteLine("服务生拿了个小杯");
}
public override void AddIngredient()
{
throw new NotImplementedException();
}
}
class Program
{
static void Main(string[] args)
{
Mochadabei m = new Mochadabei();
Xiaobaibei x = new Xiaobaibei();
m.Make();
Console.WriteLine("--------------帅气的分割线--------------");
x.Make();
Console.Read();
}
}
标签:
设计模式
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端