• 模板方法模式(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("应用知识");
    		}
    	}
    
  • 相关阅读:
    nginx的安装及简单负载均衡配置
    memcached 的配置及 spymemcached 客户端简单使用
    我的github地址
    学习3ds max插件开发过程中的一些小结
    编译opengl编程指南第八版示例代码通过
    lua执行字节码的过程介绍
    lua解析赋值类型代码的过程
    lua解析脚本过程中的关键数据结构介绍
    lua解释执行脚本流程
    lua中的string类型
  • 原文地址:https://www.cnblogs.com/LoveTomato/p/8459754.html
Copyright © 2020-2023  润新知