设计模式-模版方法模式

118 阅读3分钟

背景:在刷新闻的时候看到恒大有可能破产重组,为很多买了恒大的房子的人民感到担忧,毕竟这么大的公司出事不管最终的结果都是人民买单。还是在老家起房子比较好,在我的老家,建房子的流程是: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("我是个普通村民,我建一层楼就好了");
    }
}

村长和村民想建房,村长家庭富裕,想建的房子大点,村民没村长富裕,就选择普通点的房子,这样不同的人就可以有了建立不同房子的方式。这就是模板方法,模板方法是最简单的结构型行为方法,其中只存在子类和父类的继承关系, 通过模板方法,可以将一些附近具有稳定的业务封装到一个方法,在父类中提供一个模板放来定义整个流程的执行次序,而子类只需要实现覆盖某些特定的方法,来达到实现不同的执行效果。

总结:

  1. 模板方法只有类与类之间继承关系,不存在对象之间的关联关系
  2. 模板方法是一种基于继承的代码复用的设计模式,需要将相同的步骤的代码放到抽象父类中,不同子类来实现抽象方法,处理各自不同的逻辑
  3. 用final修饰模板方法,是为了防止方法遭到外部修改,导致模板方法的次序不稳定

tip:送给自己下面的一句话,不是鸡汤,而是自己的一种策略

  • I am Liture, if you get tired,learn to rest,not to quit.