模板方法模式
定义一个操作中的算法的骨架,将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
模板方法模式是通过把不变的行为搬到超类,去除子类中的重复方法来体现它的优势。模板方法就是提供了一个很好的代码复用平台。
当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现,通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变的行为的纠缠。
模板方法模式结构演示
抽象类:AbstractClass
abstract class AbstractClass{ public abstract void PrimitiveOperation1(); public abstract void PrimitiveOperation2(); public void TemplateMethod(){ PrimitiveOperation1(); PrimitiveOperation2(); Console.WriteLine(); } }
具体实现A/B类:ConcreteClass
class ConcreteClassA : AbstractClass{ public override void PrimitiveOperation1() => Console.WriteLine("具体类A方法1实现"); public override void PrimitiveOperation2() => Console.WriteLine("具体类A方法1实现"); } class ConcreteClassB : AbstractClass{ public override void PrimitiveOperation1() => Console.WriteLine("具体类B方法1实现"); public override void PrimitiveOperation2() => Console.WriteLine("具体类B方法1实现"); }
测试类:Program
//Main函数 ConcreteClassA a = new ConcreteClassA(); ConcreteClassB b = new ConcreteClassB(); a.TemplateMethod(); b.TemplateMethod(); //测试结果 具体类A方法1实现 具体类A方法1实现 具体类B方法1实现 具体类B方法1实现
考试答题
考卷抽象类:TestPaper
abstract class TestPaper{ public void TestQ1() => Console.WriteLine($"第一题,选:{Answer1()}"); public abstract string Answer1(); public void TestQ2() => Console.WriteLine($"第二题,选:{Answer2()}"); public abstract string Answer2(); }
学生考卷A/B类:StudentTestPaper
class StudentPaperA : TestPaper{ public override string Answer1() => "A"; public override string Answer2() => "B"; } class StudentPaperB : TestPaper{ public override string Answer1() => "B"; public override string Answer2() => "B"; }
测试类:Program
//Main函数 StudentPaperA a = new StudentPaperA(); StudentPaperB b = new StudentPaperB(); Console.WriteLine("学生A说:"); a.TestQ1(); a.TestQ2(); Console.WriteLine("学生B说:"); b.TestQ1(); b.TestQ2(); //测试结果 学生A说: 第一题,选:A 第二题,选:B 学生B说: 第一题,选:B 第二题,选:B