zoukankan      html  css  js  c++  java
  • 设计模式系列13:模板方法模式(Template Method Pattern)

    定义

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


    UML类图


    使用场景

    1. 有多个子类共有的方法,且逻辑相同,可以抽象到父类中作为模板方法实现,避免代码重复。
    2. 重要的,复杂的方法,可以考虑作为模板方法。


    C#代码实现

    using System;
     
    namespace DoFactory.GangOfFour.Template.Structural
    {
      /// <summary>
    
      /// MainApp startup class for Real-World 
    
      /// Template Design Pattern.
    
      /// </summary>
    
      class MainApp
    
      {
        /// <summary>
    
        /// Entry point into console application.
    
        /// </summary>
    
        static void Main()
        {
          AbstractClass aA = new ConcreteClassA();
          aA.TemplateMethod();
     
          AbstractClass aB = new ConcreteClassB();
          aB.TemplateMethod();
     
          // Wait for user
    
          Console.ReadKey();
        }
      }
     
      /// <summary>
    
      /// The 'AbstractClass' abstract class
    
      /// </summary>
    
      abstract class AbstractClass
    
      {
        public abstract void PrimitiveOperation1();
        public abstract void PrimitiveOperation2();
     
        // The "Template method"
    
        public void TemplateMethod()
        {
          PrimitiveOperation1();
          PrimitiveOperation2();
          Console.WriteLine("");
        }
      }
     
      /// <summary>
    
      /// A 'ConcreteClass' class
    
      /// </summary>
    
      class ConcreteClassA : AbstractClass
    
      {
        public override void PrimitiveOperation1()
        {
          Console.WriteLine("ConcreteClassA.PrimitiveOperation1()");
        }
        public override void PrimitiveOperation2()
        {
          Console.WriteLine("ConcreteClassA.PrimitiveOperation2()");
        }
      }
     
      /// <summary>
    
      /// A 'ConcreteClass' class
    
      /// </summary>
    
      class ConcreteClassB : AbstractClass
    
      {
        public override void PrimitiveOperation1()
        {
          Console.WriteLine("ConcreteClassB.PrimitiveOperation1()");
        }
        public override void PrimitiveOperation2()
        {
          Console.WriteLine("ConcreteClassB.PrimitiveOperation2()");
        }
      }
    }

    运行结果:

    image

  • 相关阅读:
    HTML5 中的Nav元素详解
    Gevent中信号量的使用
    MemCache缓存multiget hole详解
    MemCache中的内存管理详解
    Php中的强制转换详解
    Python中类的特殊方法详解
    MemCache的LRU删除机制详解
    AngularJS事件绑定的使用详解
    Php数据类型之整型详解
    HTML基础知识
  • 原文地址:https://www.cnblogs.com/mcgrady/p/10366564.html
Copyright © 2011-2022 走看看