版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangchengming1/article/details/83621035
其实模板方法在我们平时工作使用的非常频繁,但是没有学习过设计模式的小伙伴可能不是很清楚模板方法的定义是什么,即使是自己一直在用。
- 模板方法模式定义
Define the skeleton of an operation,deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure. 定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定的步骤。 - 模板方法模式通用类图
- 模板方法模式通用代码
抽象模板类
public abstract class AbstractClass {
protected abstract void otherMethod();
public void templateMethod() {
this.otherMethod();
}
}
具体实现类
public class ConcreteClass extends AbstractClass{
@Override
protected void otherMethod() {
System.out.println("otherMethod...");
}
}
场景类
public class Clinet {
public static void main(String[] args) {
ConcreteClass c = new ConcreteClass();
c.templateMethod();
}
}
- 模板方法模式实例
相信很多小伙伴都喜欢玩游戏吧,我比较喜欢玩DNF,所以就用DNF来举个例子吧。假设有A和B两个小伙伴都喜欢玩DNF,但是每次都需要打开电脑,打开游戏客户端,登录游戏。其实这部分的流程是重复的,只有游戏登录之后才是不同的,想怎么玩怎么玩。
实例类图
实例代码,首先抽象一个DNFHelper
public abstract class DNFHelper {
void openPC() {
System.out.println("打开电脑...");
};
void openDNFClient() {
System.out.println("打开DNF客户端...");
}
void loginDNF() {
System.out.println("登录DNF账号...");
}
abstract void play();
void process() {
this.openPC();
this.openDNFClient();
this.loginDNF();
this.play();
}
}
然后实例化两个玩家
public class PlayerA extends DNFHelper{
@Override
void play() {
System.out.println("玩家A开始玩DNF...");
}
}
public class PlayerB extends DNFHelper{
@Override
void play() {
System.out.println("玩家B开始玩DNF...");
}
}
然后开始玩游戏
public class Client {
public static void main(String[] args) {
PlayerA playA = new PlayerA();
playA.process();
System.out.println("-------------");
PlayerB playB = new PlayerB();
playB.process();
}
}
输出结果
打开电脑...
打开DNF客户端...
登录DNF账号...
玩家A开始玩DNF...
-------------
打开电脑...
打开DNF客户端...
登录DNF账号...
玩家B开始玩DNF...
自从有了这个DNFHelper之后,玩家终于做到可以直接开始玩游戏了,是不是很爽。
- 模版方法模式的结构
- 抽象方法:父类中只声明但不加以实现,而是定义好规范,然后由它的子类去实现。
- 模版方法:由抽象类声明并加以实现。一般来说,模版方法调用抽象方法来完成主要的逻辑功能,并且,模版方法大多会定义为final类型,指明主要的逻辑功能在子类中不能被重写。
- 钩子方法:由抽象类声明并加以实现。但是子类可以去扩展,子类可以通过扩展钩子方法来影响模版方法的逻辑。
- 模板方法模式的优点
- 行文是由父类控制的,子类负责实现。
- 比较灵活,因为有钩子方法,因此,子类的实现也可以影响父类中主逻辑的运行。
- 便于维护,符合开闭原则。
- 一般多个子类有公有的方法,并且逻辑基本相同的时候,模板方法模式很好用。
实例代码放在这里。