模板方法模式(Template Method Pattern)

模式定义

定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

UML类图

  • 抽象类(AbstractClass) 定义了一个或多个抽象操作(以便让子类实现)和一个调用这些方法的方法。这样就构成了一个框架。
  • 具体类(ConcreteClass) 实现父类定义的抽象操作。

代码结构

public static class TemplateApp
	{
		public static void Run()
		{
			AbstractClass aA = new ConcreteClassA();
			aA.TemplateMethod();

			AbstractClass aB = new ConcreteClassB();
			aB.TemplateMethod();
		}
	}

	abstract class AbstractClass
	{
		public abstract void PrimitiveOperation1();
		public abstract void PrimitiveOperation2();

		public void TemplateMethod()
		{
			PrimitiveOperation1();
			PrimitiveOperation2();
		}
	}

	class ConcreteClassA : AbstractClass
	{
		public override void PrimitiveOperation1()
		{
			Console.WriteLine("ConcreteClassA.PrimitiveOperation1()");
		}

		public override void PrimitiveOperation2()
		{
			Console.WriteLine("ConcreteClassA.PrimitiveOperation2()");
		}
	}
	class ConcreteClassB : AbstractClass
	{
		public override void PrimitiveOperation1()
		{
			Console.WriteLine("ConcreteClassB.PrimitiveOperation1()");
		}

		public override void PrimitiveOperation2()
		{
			Console.WriteLine("ConcreteClassB.PrimitiveOperation2()");
		}
	}

情景案例

虽然离开了大学,但是学习不因间断。曾读过《如何高效学习》斯科特.扬,感觉收益颇多,有事情整理下自己度过的书分享一下。下面以《如何高效学习》中的学习吃饭模型为例,实现吃饭和学习。

public static class TemplateApp
	{
		public static void Run()
		{
			Mode dinner = new Dinner();
			dinner.TemplateMethod();

			Mode study = new Study();
			study.TemplateMethod();
		}
	}

	abstract class Mode
	{
		public abstract void Search();
		public abstract void Decide();
		public abstract void Wait();
		public abstract void On();
		public abstract void Apply();

		public void TemplateMethod()
		{
			Search();
			Decide();
			Wait();
			On();
			Apply();
		}
	}

	class Dinner : Mode
	{
		public override void Search()
		{
			Console.WriteLine("找东西吃");
		}

		public override void Decide()
		{
			Console.WriteLine("点菜");
		}

		public override void Wait()
		{
			Console.WriteLine("等菜");
		}

		public override void On()
		{
			Console.WriteLine("上菜");
		}

		public override void Apply()
		{
			Console.WriteLine("开吃");
		}
	}
	class Study : Mode
	{
		public override void Search()
		{
			Console.WriteLine("获取信息");
		}

		public override void Decide()
		{
			Console.WriteLine("理解信息");
		}

		public override void Wait()
		{
			Console.WriteLine("扩展知识");
		}

		public override void On()
		{
			Console.WriteLine("知识纠错");
		}

		public override void Apply()
		{
			Console.WriteLine("应用知识");
		}
	}
原文地址:https://www.cnblogs.com/LoveTomato/p/8459754.html