设计模式之模版方法模式

首先我们先来看两个例子:冲咖啡和泡茶。冲咖啡和泡茶的基本流程如下:
在这里插入图片描述
所以用代码来创建如下:

public class Coffee {
    void prepareRecipe(){
        boilWater();
        brewCoffeeGrinds();
        pourInCup();
        addSugarAndMilk();
    }

    void boilWater(){
        System.out.println("Boiling water...");
    }

    public void brewCoffeeGrinds(){
        System.out.println("Dripping Coffee through filter...");
    }


    void pourInCup(){
        System.out.println("Pouring into Cup...");
    }

    public void addSugarAndMilk(){
        System.out.println("Adding Sugar and Milk...");
    }
}
public class Tea {
    void prepareRecipe(){
        boilWater();
        steepTeaBag();
        pourInCup();
        addLemon();
    }

    void boilWater(){
        System.out.println("Boiling water...");
    }

    public void steepTeaBag(){
        System.out.println("Steeping the tea...");
    }


    void pourInCup(){
        System.out.println("Pouring into Cup...");
    }

    public void addLemon(){
        System.out.println("Adding Lemon...");
    }
}

通过上面两个类的实现我们发现一些重复的代码。从一开始接触设计模式,我们就知道这样一个设计原则:将用中需要变化的部分取出并“封装”起来,即我们需要将某些相同代码抽象出来。根据这个原则我们可以确认这个应用中存在两个不变的部分:把水煮沸、把茶倒入杯子中,需要变化的有:用沸水冲泡咖啡(茶)、加入糖和牛奶(加入柠檬)。所以这里需要将这个变化部分抽象出来,交由子类去实现。

我们再仔细看看这两个步骤还有什么相同之处呢?这里我们发现用沸水冲泡咖啡和泡茶叶存在一个共同点,那就是用沸水冲泡,只不过冲泡的对象不同罢了,加入糖和牛奶(柠檬)同样的道理,都是加入调料,只不过加入的调料不同而已。所以这里可以将prepareRecipe()方法做如下修改:
在这里插入图片描述
做了上面的一些修改,我们可以看出泡咖啡和泡茶将共用一个相同的泡法(算法):

把水煮沸——>用沸水冲泡——>倒入杯子中——>加入调料。

通过上面的一些简要的介绍,对模板方法模式有了一个初步的认识。那么什么是模板方法模式呢?

一:定义

模板方法模式Template Pattern)就是在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

模板方法模式是基于继承的代码复用技术的。在模板方法模式中,我们可以将相同部分的代码放在父类中,而将不同的代码放入不同的子类中。也就是说我们需要声明一个抽象的父类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法让子类来实现剩余的逻辑,不同的子类可以以不同的方式来实现这些逻辑。

二:应用场景

1、 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
2、 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
3、控制子类的扩展

三:UML

在这里插入图片描述
从上面的结构可以看出,模板方法模式就两个角色:

AbstractClass: 抽象类

ConcreteClass: 具体子类

其中抽象类提供一组算法和部分逻辑的实现,具体子类实现剩余逻辑

四:简单代码实现

使用上面的泡咖啡和泡茶。

首先是抽象类,该抽象类提供了冲泡咖啡或者茶的具体流程,并且实现了逻辑步骤,煮沸水和倒入杯子中。将用沸水冲泡和加入调料交由具体的子类(咖啡、茶)来实现。

五:优点

1、模板方法模式在定义了一组算法,将具体的实现交由子类负责。
2、模板方法模式是一种代码复用的基本技术。
3、模板方法模式导致一种反向的控制结构,通过一个父类调用其子类的操作,通过对子类的扩展增加新的行为,符合“开闭原则”。

六:缺点

每一个不同的实现都需要一个子类来实现,导致类的个数增加,是的系统更加庞大。

七:模板总结

         1、  模板方法模式定义了算法的步骤,将这些步骤的实现延迟到了子类。

         2、  模板方法模式为我们提供了一种代码复用的重要技巧。

         3、  模板方法模式的抽象类可以定义抽象方法、具体方法和钩子。

         4、  为了防止子类改变算法的实现步骤,我们可以将模板方法声明为final。

转载:https://www.cnblogs.com/chenssy/p/3226744.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值