设计模式 - 模板方法模式

一、模板方法模式

  • AbstractClass 抽象类。
abstract class AbstractClass
{
//一些抽象行为,放到子类中去实现
  public abstract void PrimitiveOperation1();
  public abstract void PrimitiveOperation2();

  //模板方法,给出了逻辑的股价,而逻辑的组成是一些相应的抽象操作,它们都推迟到子类中去实现
  public void TemplateMethod()
{
  PrimitiveOperation1();
  PrimitiveOperation2();
  Console.WriteLine("");
}
}
  • ConcreteClass 实现父类所定义的一个或多个抽象方法。每一个 AbstractClass 都可以有多个 ConcreteClass 与之对应,而每一个 ConcreteClass 都可以给出这些抽象方法的不同实现,从而使得顶级逻辑的实现各不相同。
class ConcreteClassA: AbstractClass
{
    public override void PrimitiveOperation1()
    {
        Console.WriteLine("A 方法1实现");
    }
    public override void PrimitiveOperation2()
    {
        Console.WriteLine("A 方法2实现");
    }
}
class ConcreteClassB: AbstractClass
{
    public override void PrimitiveOperation1()
    {
        Console.WriteLine("B 方法1实现");
    }
    public override void PrimitiveOperation2()
    {
        Console.WriteLine("B 方法2实现");
    }
}

二、模板方法模式的特点

是通过把不变的行为放到抽象类中,取出子类中的重复代码来体现它的优势。


三、举例

using System;
namespace Factory1
{
    class TestPaper{
        public void TestQuestion1(){
            Console.WriteLine("maybe TestQuestion1 [ ]a.A b.B c.C d.D");
            Console.WriteLine("answer: " + Answer1());

        }
        public void TestQuestion2()
        {
            Console.WriteLine("maybe TestQuestion2 [ ] a.A b.B c.C d.D");
            Console.WriteLine("answer: " + Answer2());

        }
        public void TestQuestion3()
        {
            Console.WriteLine("maybe TestQuestion3 [ ] a.A b.B c.C d.D");
            Console.WriteLine("answer: " + Answer3());
        }
        protected virtual string Answer1()
        {
            return "";
        }
        protected virtual string Answer2()
        {
            return "";
        }
        protected virtual string Answer3()
        {
            return "";
        }
    }
    class TestPaperA: TestPaper{


        protected override string Answer1()
        {
            return "b";
        }
        protected override string Answer2()
        {
            return "c";
        }
        protected override string Answer3()
        {
            return "a";
        }
    }

    class TestPaperB: TestPaper{


        protected override string Answer1()
        {
            return "c";
        }
        protected override string Answer2()
        {
            return "b";
        }
        protected override string Answer3()
        {
            return "a";
        }
    }
  //调用
    class MainClass
    {
        public static void Main (string[] args)
        {

            Console.WriteLine ("studentA");
            TestPaper studentA = new TestPaperA ();
            studentA.TestQuestion1 ();
            studentA.TestQuestion2 ();
            studentA.TestQuestion3 ();

            TestPaper studentB = new TestPaperB ();
            studentB.TestQuestion1 ();
            studentB.TestQuestion2 ();
            studentB.TestQuestion3 ();

            Console.Read ();
        }
    }
}

+结果:

studentA
maybe TestQuestion1 [ ]a.A b.B c.C d.D
answer: b
maybe TestQuestion2 [ ] a.A b.B c.C d.D
answer: c
maybe TestQuestion3 [ ] a.A b.B c.C d.D
answer: a
maybe TestQuestion1 [ ]a.A b.B c.C d.D
answer: c
maybe TestQuestion2 [ ] a.A b.B c.C d.D
answer: b
maybe TestQuestion3 [ ] a.A b.B c.C d.D
answer: a

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 概述 定义一个操作中的算法的骨架,而将步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义算...
    时待吾阅读 394评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,260评论 19 139
  • 1. [C#语言基础]请简述拆箱和装箱。 答: 装箱操作: 值类型隐式转换为object类型或由此值类型实现的任何...
    胤醚貔貅阅读 4,927评论 1 29
  • 1. 定义 模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一...
    SyncAny阅读 290评论 0 0
  • 目录本次给大家介绍的是我收集以及自己个人保存一些.NET面试题第二篇简介1.接口2.您在什么情况下会用到虚方法或抽...
    寒剑飘零阅读 2,003评论 0 10