zoukankan      html  css  js  c++  java
  • 大话设计模式-模板方法模式

    模板方法模式

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

    模板方法模式是通过把不变的行为搬到超类,去除子类中的重复方法来体现它的优势。模板方法就是提供了一个很好的代码复用平台。

    当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现,通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变的行为的纠缠。

     


    模板方法模式结构演示

    抽象类: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
  • 相关阅读:
    《家庭财务总管》升级了(1.0.0.1)
    谁拥有接口?
    VScode调试C++工程
    NVIDIA显卡原生管理查询功能nvidiasmi的部分使用功能
    python版本的两款NVIDIA显卡管理查询工具
    pytorch之网络参数统计 torchstat & torchsummary
    电脑、笔记本、手机维修经验分享网站,专业领域网站
    Python使用pynvml查看GPU信息
    【转载】 Ubuntu下使用VSCode的launch.json及tasks.json编写
    笔记本挑电源适配器吗,是不是电压相同情况下保证功率大于等于原装适配器就可以保证笔记本正常运行???
  • 原文地址:https://www.cnblogs.com/errornull/p/10052837.html
Copyright © 2011-2022 走看看