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设计模式之模板方法模式的主要内容,如果未能解决你的问题,请参考以下文章