背景:在刷新闻的时候看到恒大有可能破产重组,为很多买了恒大的房子的人民感到担忧,毕竟这么大的公司出事不管最终的结果都是人民买单。还是在老家起房子比较好,在我的老家,建房子的流程是:1.找好宅基地 2.向村里申请 3.村里审核 4.建房 5.领取房产证
概念:建房子的流程是一个稳定规范的流程,在生产中可以用到模板设计模式:在一个方法中定义了一个算法的骨架或者步骤,而将一些步骤延迟到子类中去实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某一些步骤
模板设计模式应用的场景:某个功能具有特定稳定的步骤,可以提炼一个抽象父类,子类负责实现变化部分,如下例子:
public abstract class AbstractBuildHouseHandeler {
/**
* 模板方法
*
*/
public final void execut() {
findAHomesteadHandeler();
applyToTheVillage();
check();
buildHouseHandeler();
getRealEstateCertificate();
}
/**
* 寻找在宅基地
*/
public abstract void findAHomesteadHandeler();
/**
* 向村里申请建房
*/
private void applyToTheVillage() {
System.out.println("向村里申请建房");
}
/**
* 村里审核
*/
private void check() {
System.out.println("村里审核");
}
/**
* 建房
*/
public abstract void buildHouseHandeler();
/**
* 领取房产证
*/
private void getRealEstateCertificate() {
System.out.println("获取房产证");
}
}
该类中定义了五个方法,其中check()、applyToTheVillage()和getRealEstateCertificate()方法是私有的,它们实现了审核、申请、获取房产证流程,因为是通用的,还存在两个抽象的方法findAHomesteadHandeler()和buildHouseHandeler(),这两个方法需要子类去重写,还定义的final类型execute模板方法,如果村里有人想建房子,只要继承该类,执行execute方法就可以开始了建房的整个流程。
public class VillageHeadHandeler extends AbstractBuildHouseHandeler{
@Override
public void findAHomesteadHandeler() {
System.out.println("我是村长,我要找村里最好位置和最大的在基地来建房");
}
@Override
public void buildHouseHandeler() {
System.out.println("我是村长,我要建最高的房");
}
}
public class VillagerHandeler extends AbstractBuildHouseHandeler{
@Override
public void findAHomesteadHandeler() {
System.out.println("我是个普通村民,我建房找块小点的宅基地就行");
}
@Override
public void buildHouseHandeler() {
System.out.println("我是个普通村民,我建一层楼就好了");
}
}
村长和村民想建房,村长家庭富裕,想建的房子大点,村民没村长富裕,就选择普通点的房子,这样不同的人就可以有了建立不同房子的方式。这就是模板方法,模板方法是最简单的结构型行为方法,其中只存在子类和父类的继承关系, 通过模板方法,可以将一些附近具有稳定的业务封装到一个方法,在父类中提供一个模板放来定义整个流程的执行次序,而子类只需要实现覆盖某些特定的方法,来达到实现不同的执行效果。
总结:
- 模板方法只有类与类之间继承关系,不存在对象之间的关联关系
- 模板方法是一种基于继承的代码复用的设计模式,需要将相同的步骤的代码放到抽象父类中,不同子类来实现抽象方法,处理各自不同的逻辑
- 用final修饰模板方法,是为了防止方法遭到外部修改,导致模板方法的次序不稳定
tip:送给自己下面的一句话,不是鸡汤,而是自己的一种策略
- I am Liture, if you get tired,learn to rest,not to quit.