第 3 章 Template Method 模式 -- 将具体处
2018-08-31 本文已影响1人
oO反骨仔Oo
image.png
image.png
Template Method 模式
概念:在父类中定义处理流程的框架,在子类中实现具体处理的模式。
示例
image.png /// <summary>
/// 抽象显示
/// </summary>
public abstract class AbstractDisplay
{
/// <summary>
/// 打开
/// </summary>
public abstract void Open();
/// <summary>
/// 打印
/// </summary>
public abstract void Print();
/// <summary>
/// 关闭
/// </summary>
public abstract void Close();
/// <summary>
/// 显示
/// </summary>
public void Display()
{
Open();
for (var i = 0; i < 5; i++)
{
Print();
}
Close();
}
}
/// <summary>
/// 字符显示
/// </summary>
public class CharDisplay : AbstractDisplay
{
private readonly char _c;
public CharDisplay(char c)
{
_c = c;
}
public override void Open()
{
Console.Write("<<");
}
public override void Print()
{
Console.Write(_c);
}
public override void Close()
{
Console.WriteLine(">>");
}
}
/// <summary>
/// 字符串显示
/// </summary>
public class StringDisplay : AbstractDisplay
{
private readonly string _str;
private readonly int _width;
public StringDisplay(string str)
{
_str = str;
_width = Encoding.UTF8.GetByteCount(_str);
}
public override void Open()
{
PrintLine();
}
public override void Print()
{
Console.WriteLine($"|{_str}|");
}
public override void Close()
{
PrintLine();
}
private void PrintLine()
{
Console.Write("+");
for (var i = 0; i < _width; i++)
{
Console.Write("-");
}
Console.WriteLine("+");
}
}
internal class Program
{
private static void Main(string[] args)
{
AbstractDisplay ad = new CharDisplay('H');
AbstractDisplay ad2 = new StringDisplay("Hello,world.");
AbstractDisplay ad3 = new StringDisplay("你好,世界。");
ad.Display();
ad2.Display();
ad3.Display();
Console.Read();
}
}
image.png
角色梳理
AbstractClass 抽象类
负责实现模板方法,以及声明在模板方法中用到的抽象方法,抽象方法由子类 ConcreteClass 角色实现。
ConcreteClass 具体类
负责实现 AbstractClass 中定义的抽象方法,所实现的方法会在对应的模板方法中被调用。
image.png
要点 & 思路
1.使逻辑通用化,在父类的模板方法中编写了算法,因此无需再每个子类中再编写算法;
相关模式
Factory Method 模式
Factory Method 模式通过 Template Method 模式生成实例。
Strategy 模式
Template Method 模式通过继承改变程序行为,Strategy 通过替换算法改变程序行为。
《图解设计模式》