设计模式之模板方法

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

一、模板方法模式

在软件开发中,某个方法实现需要多步操作,我们就将每一步的操作称之为基本方法,所有的步骤综合起来完成,称之为模板方法。在模板方法中,有一些步骤是固定不变的,有一些步骤是要变化的。我们就可以将其中固定的部分交由父类实现,不固定的部分交由子类实现。

通过调用抽象类,实现对子类的调用。其UML图如下:

这里写图片描述

抽象类(AbstractClass):也是一个抽象模板,定义了模板方法,定义了算法的骨架。

具体类(ConcreteClass):实现抽象类中的抽象方法,以完成完整的算法。

二、 案例分析

我们接茬《西游记》,聊聊模板方式模式。

走过最长的路就是你的套路

话说孙悟空在三打白骨精,杀了众多强盗,被师傅念了紧箍咒之后,也学会了一定的“套路”,在之后降妖路上,大都是这样的:师傅被妖怪捉走,第一步是叫出土地山神,打探妖精来历;第二步才去降妖除魔,有时找这妖怪的主子来降服,有时得知妖怪弱点,好下手擒之;这里的擒妖套路,就是一个模板,每次收复不同的妖怪就是一次具体的实现。其UML图如下:

这里写图片描述

代码如下:

AbstractClass–捉妖套路(CatchMonster)类

abstract class CatchMonster{
    //固定方法
    public void callTuDi(){
        System.out.println("召唤土地,看看这妖精是啥来头");
    }

    //子类需要实现的方法
    public abstract void arrestMonster();

    //模板方法,定义捉妖套路
    public void catchMonster(){
        callTuDi();
        arrestMonster();
    }
}

具体类(ConcreteClass)–实现具体的捉妖方法

class ConcreteCatchMonsterA extends CatchMonster{

    public void arrestMonster(){
        System.out.println("这个妖精是太上老君的青牛,我找他去!让他来降服这厮。");
    }
}

class ConcreteCatchMonsterB extends CatchMonster{

    public void arrestMonster(){
        System.out.println("土地说这个妖精没有后台,直接打他。");
    }
}

故事上演:

public class Story{ 
        public static void main(String[] args) { 

       CatchMonster c;

        System.out.println("话说唐三藏被兕大王掠去,于是悟空");
        c = new ConcreteCatchMonsterA ();
        c.catchMonster();

        System.out.println("话说唐三藏又被祭赛国九头驸马捉去,于是悟空:");
        c = new ConcreteCatchMonsterB ();
        c.catchMonster();
   }
}

运行结果(代码亲测,可以通过):

这里写图片描述

代码地址:Template

综上,在实现一些操作时,整体步骤很固定,但是呢。就是其中一小部分容易变,这时候可以使用模板方法模式,将容易变的部分抽象出来,供子类实现。

欢迎大家评论留言,点击查看更多设计模式

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值