[设计模式]设计模式之模板方法模式

Sep 17, 2016


模式中的角色:

抽象方法:一个抽象方法由抽象类声明,由具体子类实现。抽象方法以abstract关键字标示。

具体方法:一个具体方法由抽象类声明并实现,而子类并不实现或置换。

钩子方法:一个钩子方法由抽象类声明并实现,而子类会加以扩展。通常抽象类给出的实现是一个空实现,作为方法的默认实现。

/// <summary>  
    /// 抽象类  
    /// </summary>  
    public abstract class AbstractClass  
    {  
        // 一些抽象行为,放到子类去实现  
        public abstract void PrimitiveOperation1();  
        public abstract void PrimitiveOperation2();  
  
        /// <summary>  
        /// 模板方法,给出了逻辑的骨架,而逻辑的组成是一些相应的抽象操作,它们推迟到子类去实现。  
        /// </summary>  
        public void TemplateMethod()  
        {  
            PrimitiveOperation1();  
            PrimitiveOperation2();  
            Console.WriteLine("Done the method.");  
        }  
    }  
  
    /// <summary>  
    /// 具体类,实现了抽象类中的特定步骤  
    /// </summary>  
    public class ConcreteClassA : AbstractClass  
    {  
        /// <summary>  
        /// 与ConcreteClassB中的实现逻辑不同  
        /// </summary>  
        public override void PrimitiveOperation1()  
        {  
            Console.WriteLine("Implement operation 1 in Concreate class A.");  
        }  
  
        /// <summary>  
        /// 与ConcreteClassB中的实现逻辑不同  
        /// </summary>  
        public override void PrimitiveOperation2()  
        {  
            Console.WriteLine("Implement operation 2 in Concreate class A.");  
        }  
    }  
  
    /// <summary>  
    /// 具体类,实现了抽象类中的特定步骤  
    /// </summary>  
    public class ConcreteClassB : AbstractClass  
    {  
        /// <summary>  
        /// 与ConcreteClassA中的实现逻辑不同  
        /// </summary>  
        public override void PrimitiveOperation1()  
        {  
            Console.WriteLine("Implement operation 1 in Concreate class B.");  
        }  
  
        /// <summary>  
        /// 与ConcreteClassA中的实现逻辑不同  
        /// </summary>  
        public override void PrimitiveOperation2()  
        {  
            Console.WriteLine("Implement operation 2 in Concreate class B.");  
        }  
    }  
class Program  
    {  
        static void Main(string[] args)  
        {  
            // 声明抽象类  
            AbstractClass c;  
  
            // 用ConcreteClassA实例化c  
            c = new ConcreteClassA();  
            c.TemplateMethod();  
  
            // 用ConcreteClassB实例化c  
            c = new ConcreteClassB();  
            c.TemplateMethod();  
  
            Console.Read();  
        }  
    }