Java设计模式之模板方法模式

Posted 红日666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java设计模式之模板方法模式相关的知识,希望对你有一定的参考价值。

一、定义:

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

模板方法模式的结构图:

模板方法模式有如下角色:
1、AbstractClass:抽象类,定义了一套算法框架。
2、ConcreteClass:具体实现类。

二、模板方法模式的实现:

1、创建抽象类,定义算法框架:
/**
 * 创建抽象类,定义算法框架
 */
public abstract class AbstractSwordsman 
    //空实现方法
    protected void hook() 
    

    protected abstract void neiGong();

    protected abstract void weapons();

    protected abstract void moves();

    protected void meridian() 
        System.out.println("开启正经与奇经");
    

    protected boolean hasWeapons() 
        return true;
    

    //该方法为final方法,放置算法框架被覆写
    public final void fighting() 
        //1、首先发内功,抽象方法
        neiGong();
        //2、其次调整经脉,具体方法
        meridian();
        //3、然后【如果有的话】使用武器
        if (hasWeapons()) 
            weapons();
        
        //4、使用招式
        moves();
        //5、钩子方法
        hook();
    

2、具体实现类:
/**
 * 具体实现类 - 张无忌
 */
public class ZhangWuJi extends AbstractSwordsman 
    @Override
    protected void neiGong() 
        System.out.println("运行九阳神功");
    

    @Override
    protected void weapons() 
        System.out.println("");
    

    @Override
    protected void moves() 
        System.out.println("使用招式乾坤大挪移");
    

    @Override
    protected boolean hasWeapons() 
        return false;
    

/**
 * 具体实现类 - 张三丰
 */
public class ZhangSanFeng extends AbstractSwordsman 
    @Override
    protected void neiGong() 
        System.out.println("运行纯阳无极功");
    

    @Override
    protected void weapons() 
        System.out.println("使用真武剑");
    

    @Override
    protected void moves() 
        System.out.println("使用招式神门十三剑");
    

    @Override
    protected void hook() 
        System.out.println("突然肚子不舒服,老夫要先去上厕所");
    

3、客户端调用:
 /**
 * 模板方法模式
 */
ZhangWuJi zhangWuJi = new ZhangWuJi();
zhangWuJi.fighting();

ZhangSanFeng zhangSanFeng = new ZhangSanFeng();
zhangSanFeng.fighting();

运行结果:


三、使用场景和优缺点:

1、使用场景:

1)多个子类有共同的方法,并且逻辑基本相同时。
2)面对重要、复杂的算法,可以把核心算法设计为模板方法模式,相关细节则由各个子类实现。
3)需要通过子类来决定父类算法中的某个步骤是否执行,实现子类对父类的反向控制。

2、优点:

1)模板方法模式通过把不变的行为搬移到超类,祛除了子类中的重复代码。
2)子类实现算法的某些细节,有助于算法的扩展。

3、缺点:

1)每个算法都需要定义一个子类,这会导致类个数的增加,设计更加抽象。
2)子类执行的结果影响了父类的结果,也就是子类对父类产生了影响,这在复杂的项目中,会带来代码阅读的难度,而且也会让新手产生不适感。



参考:
设计模式综述

以上是关于Java设计模式之模板方法模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式13-- 模板模式怎么弄?

java设计模式之模板方法模式

Java设计模式之模板方法模式(Template Method)

Java设计模式(16)——行为模式之模板方法模式(Template)

Java设计模式之模板方法模式(Template)

Java设计模式之模板方法模式