模板模式:
个人认为模板模式可以很好的对不同类似对象复用,从而达到减少代码量和易于维护的目的。
书上是这么说的:在一个方法中定义算法骨架,而将一些步骤延迟到子类中,末班方法使得子类在不改变算法结构的情况下,重新定义算法中的某些步骤。
模板模式使用的原则------好莱坞原则 低层不调用高层 高层会调用低层
和依赖倒转原则,两者皆依赖于抽象相比有什么不同呢?
个人认为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();
}
}