阅读原文: 把「模板方法」应用到实际项目中java
若是不在工做中思考,模板方法模式的概念和定义即便背再多遍估计也是徒劳,今天我思考如何解决实际项目中的问题时发现,模板方法正是解决问题的良策。面试
咱们项目中要实现一个建立会议的需求,但咱们系统可设置将会议同步到其余第三方系统中。而在建立会议前要通过几个必须的步骤,好比验证冲突,计算循环规则,对比时间段是否符合等。算法
建立会议的方式不一样:架构
即便会议又冲突,但有需求是依然要能建立成功!因此验证冲突步骤是可选的。ide
业务梳理后以下:spa
只有抽象类能实现咱们的要求,既能要一部分方法有实现又能实现抽象方法不用实现。3d
@Slf4j
public abstract class AbstarctRecurringHandler {
/** * 处理建立会议 */
public final void handle() {
if (isConfirm()) {
calculateConflict();
}
calcBookingPeriod();
checkRule();
createEvent();
}
/** * 验证规则 */
public void checkRule() {}
/** * 获取预约的全部会议时间段 * * @return */
public List<Period> calcBookingPeriod() {}
/** * 计算冲突会议 */
public void calculateConflict() {}
/** * 钩子方法 * * @return */
public abstract boolean isConfirm();
public abstract void createEvent();
}
复制代码
咱们这里的handle方法已经固定了整个建立会议的流程,而且咱们使用final修饰,表示不容许别人修改这个过程。 不一样的建立可能有不一样的人来完成,这个可以避免部分人员的粗枝大叶也就是规范了建立流程,并且其余开发人员也没必要再关心除建立会议以外的其余过程。code
虽然咱们的建立会议的总体过程不容许修改,但部分功能可能有所不一样,因此咱们须要钩子方法来使部分功能可选或者改变部分流程。钩子方法可以使用默认值,也可由子类来决定是否改变。cdn
两个子类惟一的职责就只剩单纯的建立功能。视频
@Slf4j
@Service
public class LocalRecurringHandler extends AbstarctRecurringHandler {
/** * 钩子方法 * * @return */
@Override
public boolean isConfirm() {
return true;
}
@Override
public void createEvent() {
//建立本地会议
}
}
复制代码
@Slf4j
@Service
public class EwsRecurringHandler extends AbstarctRecurringHandler {
/** * 钩子方法 * * @return */
@Override
public boolean isConfirm() {
return false;
}
@Override
public void createEvent() {
//建立本地会议
}
}
复制代码
定义一个操做中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类能够不改变一个算法的结构便可重定义该算法的某些特定步骤。
模板方法模式涉及到的角色有:
抽象模板角色
定义一组基本方法供子类实现,定义并实现组合了基本方法的模板方法。
具体模板角色
实现抽象模板角色定义的基本方法。
提升代码的复用性
相同的代码放到了抽象类中,复用且可维护性强。
具备必定的扩展性
不一样的实现交由子类来自行实现,用子类来进行扩展。
反向控制
行为由父类控制,子类实现。
实践要在理论的基础之上,因此理论基础也是很是重要的。
关注 「码上实战」 回复 :面试视频 和 架构师 送你很是不错的资料。