设计模式(17)---模板方法模式

一、定义

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

解释:简单来说,需要定义一个通用的基类,但是基类中不同的操作,于是模板方法模式将不同的操作编写成一个抽象函数放到子类中实现,这样即可完成通用基类的目的。

 

二、UML类图及基本代码

 

基本代码:

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

        public void TemplateMethod()
        {
            PrimitiveOperation1();
            PrimitiveOperation2();
            Console.WriteLine("基类的行为");
        }
    }

    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的实现");
        }
    }

客户端调用及结果:

AbstractClass ac;
            ac = new ConcreteClassA();
            ac.TemplateMethod();

            Console.WriteLine("");
            ac = new ConcreteClassB();
            ac.TemplateMethod();
View Code

 

三、实例说明

日常生活中做菜这件事,虽然做不同的菜的方式不一样,但绝大多数步骤是一样的,本例用炒菠菜和炒白菜作为实例进行说明模板方法模式,基本代码如下:

public abstract class Vegetable
    {
        public void CookVegetable()
        {
            Console.WriteLine("烧蔬菜的一般方法:");
            this.PoilOil();
            this.HeatOil();
            PourVegetable();
        }

        public void PoilOil()
        {
            Console.WriteLine("倒油");
        }

        public void HeatOil()
        {
            Console.WriteLine("把油烧热");
        }

        public abstract void PourVegetable();
    }

    public class Spinach : Vegetable
    {
        public override void PourVegetable()
        {
            Console.WriteLine("菠菜倒进锅中");
        }
    }

    public class Cabbage : Vegetable
    {
        public override void PourVegetable()
        {
            Console.WriteLine("白菜倒进锅中");
        }
    }
View Code

 

客户端调用及运行结果:

Vegetable sp = new Spinach();
            sp.CookVegetable();

 

四、优缺点及适用场景

优点:

1)实现了代码复用

2)能够灵活应对子类步骤的变化,符合开放-封闭原则

即:封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。

缺点:

引入了一个抽象类,使系统逻辑更加复杂。

 

适用场景:

模板方法模式通过把不变的行为搬移到超类,去除子类中的重复代码来体现其优势。因此凡是能体现此优点的地方都可以使用模板方法模式。

转载于:https://www.cnblogs.com/ysyn/p/4153767.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值