head first 设计模式学习随笔(8)----模板模式

模板模式:

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

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

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

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

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

 

head first 设计模式学习随笔(8)----模板模式

你可能感兴趣的:(first)