模板方法模式(Template Method Pattern)

模式定义

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

UML类图

1236909-20180222181258903-905985334.png

  • 抽象类(AbstractClass) 定义了一个或多个抽象操作(以便让子类实现)和一个调用这些方法的方法。这样就构成了一个框架。
  • 具体类(ConcreteClass) 实现父类定义的抽象操作。

    代码结构

public static class TemplateApp
    {
        public static void Run()
        {
            AbstractClass aA = new ConcreteClassA();
            aA.TemplateMethod();

            AbstractClass aB = new ConcreteClassB();
            aB.TemplateMethod();
        }
    }

    abstract class AbstractClass
    {
        public abstract void PrimitiveOperation1();
        public abstract void PrimitiveOperation2();

        public void TemplateMethod()
        {
            PrimitiveOperation1();
            PrimitiveOperation2();
        }
    }

    class ConcreteClassA : AbstractClass
    {
        public override void PrimitiveOperation1()
        {
            Console.WriteLine("ConcreteClassA.PrimitiveOperation1()");
        }

        public override void PrimitiveOperation2()
        {
            Console.WriteLine("ConcreteClassA.PrimitiveOperation2()");
        }
    }
    class ConcreteClassB : AbstractClass
    {
        public override void PrimitiveOperation1()
        {
            Console.WriteLine("ConcreteClassB.PrimitiveOperation1()");
        }

        public override void PrimitiveOperation2()
        {
            Console.WriteLine("ConcreteClassB.PrimitiveOperation2()");
        }
    }

情景案例

虽然离开了大学,但是学习不因间断。曾读过《如何高效学习》斯科特.扬,感觉收益颇多,有事情整理下自己度过的书分享一下。下面以《如何高效学习》中的学习吃饭模型为例,实现吃饭和学习。

public static class TemplateApp
    {
        public static void Run()
        {
            Mode dinner = new Dinner();
            dinner.TemplateMethod();

            Mode study = new Study();
            study.TemplateMethod();
        }
    }

    abstract class Mode
    {
        public abstract void Search();
        public abstract void Decide();
        public abstract void Wait();
        public abstract void On();
        public abstract void Apply();

        public void TemplateMethod()
        {
            Search();
            Decide();
            Wait();
            On();
            Apply();
        }
    }

    class Dinner : Mode
    {
        public override void Search()
        {
            Console.WriteLine("找东西吃");
        }

        public override void Decide()
        {
            Console.WriteLine("点菜");
        }

        public override void Wait()
        {
            Console.WriteLine("等菜");
        }

        public override void On()
        {
            Console.WriteLine("上菜");
        }

        public override void Apply()
        {
            Console.WriteLine("开吃");
        }
    }
    class Study : Mode
    {
        public override void Search()
        {
            Console.WriteLine("获取信息");
        }

        public override void Decide()
        {
            Console.WriteLine("理解信息");
        }

        public override void Wait()
        {
            Console.WriteLine("扩展知识");
        }

        public override void On()
        {
            Console.WriteLine("知识纠错");
        }

        public override void Apply()
        {
            Console.WriteLine("应用知识");
        }
    }

转载于:https://www.cnblogs.com/LoveTomato/p/8459754.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值