原理:
在模板模式(Template Pattern)中,一個(gè)抽象類(lèi)公開(kāi)定義了執(zhí)行它的方法的方式/模板。它的子類(lèi)可以按需要重寫(xiě)方法實(shí)現(xiàn),但調(diào)用將以抽象類(lèi)中定義的方式進(jìn)行。這種類(lèi)型的設(shè)計(jì)模式屬于行為型模式。
意圖:
定義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類(lèi)中。模板方法使得子類(lèi)可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。
主要解決:
一些方法通用,卻在每一個(gè)子類(lèi)都重新寫(xiě)了這一方法。
應(yīng)用實(shí)例:
1、在造房子的時(shí)候,地基、走線(xiàn)、水管都一樣,只有在建筑的后期才有加壁櫥加?xùn)艡诘炔町悺?2、西游記里面菩薩定好的 81 難,這就是一個(gè)頂層的邏輯骨架。
代碼
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 模板方法模式
{
class Program
{
static void Main(string[] args)
{
AbstractClass c;
c = new ConcreteClassA();
c.TemplateMethod();
c = new ConcreteClassB();
c.TemplateMethod();
Console.ReadKey();
}
}
}
Template.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 模板方法模式
{
abstract class AbstractClass
{
//一些抽象行為放到子類(lèi)去實(shí)現(xiàn)
public abstract void PrimitiveOperation1();
public abstract void PrimitiveOperation2();
//模板方法,給出了邏輯的骨架,而邏輯的組成是一些相應(yīng)的抽象操作,他們都推遲到子類(lèi)實(shí)現(xiàn)
public void TemplateMethod()
{
PrimitiveOperation1();
PrimitiveOperation2();
Console.WriteLine("");
}
}
class ConcreteClassA : AbstractClass
{
public override void PrimitiveOperation1()
{
Console.WriteLine("具體類(lèi)A方法1實(shí)現(xiàn)");
}
public override void PrimitiveOperation2()
{
Console.WriteLine("具體類(lèi)A方法2實(shí)現(xiàn)");
}
}
class ConcreteClassB : AbstractClass
{
public override void PrimitiveOperation1()
{
Console.WriteLine("具體類(lèi)B方法1實(shí)現(xiàn)");
}
public override void PrimitiveOperation2()
{
Console.WriteLine("具體類(lèi)B方法2實(shí)現(xiàn)");
}
}
}