Jimmypony的技术汇总区
很多都不会,很多都不懂,不要浮躁,静心学习
posts - 51,comments - 22,views - 75074

模板模式:

个人认为模板模式可以很好的对不同类似对象复用,从而达到减少代码量和易于维护的目的。

书上是这么说的:在一个方法中定义算法骨架,而将一些步骤延迟到子类中,末班方法使得子类在不改变算法结构的情况下,重新定义算法中的某些步骤。

模板模式使用的原则------好莱坞原则 低层不调用高层 高层会调用低层

和依赖倒转原则,两者皆依赖于抽象相比有什么不同呢?

  个人认为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();
}
}
复制代码

 

posted on   Jim~  阅读(330)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
< 2008年9月 >
31 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 1 2 3 4
5 6 7 8 9 10 11

点击右上角即可分享
微信分享提示