模板方法模式(TemplateMethod Pattern) :定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板该当使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
AbstractClass类:
namespace TemplateMethodPattern.BasicStructure { abstract class AbstractClass { public abstract void PrimitiveOperation1(); public abstract void PrimitiveOperation2(); /// <summary> /// 模板方法 /// 给出了逻辑的骨架,而逻辑的组成是一些相应的抽象操作 /// 这些逻辑都推迟到子类实现 /// </summary> public void TemplateMethod() { PrimitiveOperation1(); PrimitiveOperation2(); Console.WriteLine(""); } } }
ConcreteClassA类:
namespace TemplateMethodPattern.BasicStructure { class ConcreteClassA : AbstractClass { public override void PrimitiveOperation1() { Console.WriteLine("具体类A方法1实现"); } public override void PrimitiveOperation2() { Console.WriteLine("具体类A方法2实现"); } } }
ConcreteClassB类:
namespace TemplateMethodPattern.BasicStructure { class ConcreteClassB : AbstractClass { public override void PrimitiveOperation1() { Console.WriteLine("具体类B方法1实现"); } public override void PrimitiveOperation2() { Console.WriteLine("具体类B方法2实现"); } } }
客户端调用代码:
static void Main(string[] args) { try { {//BasicStructure AbstractClass c = new ConcreteClassA(); c.TemplateMethod(); c = new ConcreteClassB(); c.TemplateMethod(); } } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadKey(); }
结果如下:
场景模拟:根据各部件来组装一部iphone手机,一部手机除了内存不同外,其它的组装步骤都一样。
AppleHandset(苹果手机)类——AbstractClass类
namespace TemplateMethodPattern.SituationSimulation { abstract class AppleHandset { /// <summary> /// 手机基架 /// </summary> public void Frame() { Console.WriteLine("手机基架"); } /// <summary> /// 手机摄像头 /// </summary> public void Camera() { Console.WriteLine("安装手机基架"); } /// <summary> /// 手机摄像头 /// </summary> public void Battery() { Console.WriteLine("安装手机电池"); } /// <summary> /// 手机内存卡 /// </summary> public abstract void MemoryCard(); /// <summary> /// 组装手机 /// </summary> public void Assemble() { Frame(); Camera(); Battery(); MemoryCard(); Console.WriteLine(""); } } }
AppleHandset64G(64G苹果手机)类——ConcreteClassA类
namespace TemplateMethodPattern.SituationSimulation { class AppleHandset64G : AppleHandset { public override void MemoryCard() { Console.WriteLine("插上64G内存卡"); } } }
AppleHandset128G(128G苹果手机)类——ConcreteClassB类
namespace TemplateMethodPattern.SituationSimulation { class AppleHandset128G : AppleHandset { public override void MemoryCard() { Console.WriteLine("插上128G内存卡"); } } }
客户端调用代码:
static void Main(string[] args) { try { {//SituationSimulation AppleHandset appleHandset = new AppleHandset64G(); appleHandset.Assemble(); appleHandset = new AppleHandset128G(); appleHandset.Assemble(); } } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadKey(); }
结果如下:
模板方法模式的优点
模板方法模式的缺点
根据模板方法模式的使用目的,常见的模板方法模式有以下几种类型:
源代码地址:https://github.com/houzhenhuang/DesignPattern
原文:https://www.cnblogs.com/hhzblogs/p/10431160.html