二十三种设计模式之-模板方法模式

这是我写二十三种设计模式第二篇文章。这个系列我将持续写下去,欢迎大家关注,点赞和收藏。

模板方法模式

1.模板方法模式(Template Method Pattern)又叫模板模式,在一个抽象的类中,公开定义了要执行的方法的模板。它的子类可以按照需要重写方法实现。但是调用将以抽象类中定义的方法进行。

2.简单的说,模板方法模式定义一个操作中的算法骨架,将进一步实现的步骤延迟到子类中,使得子类可以不改变一个算法的结构。就可以重定义该算法的某些特定的步骤。

3.这种类型的设计模式属于行为模式。

模板方法的UML图

二十三种设计模式之-模板方法模式

1.AbstractClass 抽象类,类中事项模板方法,定义了算法骨架,具体需要子类去实现,其他的抽象方法operationr2,3,4

2.ConcreteClass 事项抽象方法operationr2,3,4

模板方法来实现豆浆只做问题

编写豆浆的程序,说明如下,

模板方法的例子代码实现

1.定义模板类

/**
 * 抽象类表示豆浆
 */
public abstract class SoyaMilk {
    //模板方法make ,一般设置成final ,不让子类去覆盖
    final void make(){
      select();
        if (customerChoose()){
            addCondiments();
        }
        soak();
        beat();

    }

    //选材料
    void select(){
      System.out.println("第一步,选择大豆");
    }
    //添加不同配料,抽象方法,具体有子类去实现

    abstract void addCondiments();
    //浸泡,
    void soak(){
        System.out.println("第三步,黄豆和配料开始浸泡 ,需要3个小时");
    }
    void beat(){
        System.out.println("第四步 ,黄豆和配料打碎");
    }



}

定义子类

public class RedBeanMilk extends SoyaMilk{
    @Override
    void addCondiments() {
        System.out.println("加入上好的黄豆");
    }
}
public class PeanutMilk extends SoyaMilk{
    @Override
    void addCondiments() {
        System.out.println("添加上好的花生");
    }
}

调用方法。

public class Client {

    public static void main(String[] args) {
        System.out.println("制作红豆豆浆");
        SoyaMilk redBeanSoyaMilk = new RedBeanMilk();
        redBeanSoyaMilk.make();

        System.out.println("制作花生豆浆");
        SoyaMilk peanutSoyaMilk = new PeanutMilk();
        redBeanSoyaMilk.make();

    }

}

模板方法模式的钩子方法

模板方法模式的钩子方法

1.在模板方法的父类中,我们可以定义一个方法,他默认可以不做任何事情,子类可以视情况要不要覆盖它,该方法称为钩子

2.还是以上面的制作豆浆的例子来讲解,我们需要制作纯豆浆,不添加任何配料,我们需要用钩子方法对前面的模板进行改造。

1.给抽象类添加钩子方法。

/**
 * 抽象类表示豆浆
 */
public abstract class SoyaMilk {
    //模板方法make ,一般设置成final ,不让子类去覆盖
    final void make(){
        select();
        if (customerChoose()){
            addCondiments();
        }
        soak();
        beat();
    }

    //选材料
    void select(){
      System.out.println("第一步,选择大豆");
    }
    //钩子方法 是否要添加配料
    boolean customerChoose(){
        return true;
    }


    //添加不同配料,抽象方法,具体有子类去实现

    abstract void addCondiments();
    //浸泡,
    void soak(){
        System.out.println("第三步,黄豆和配料开始浸泡 ,需要3个小时");
    }
    void beat(){
        System.out.println("第四步 ,黄豆和配料打碎");
    }



}

子类覆盖钩子方法

public class PurSoyaMilk extends SoyaMilk{

    @Override
    boolean customerChoose() {
        return false;
    }

    @Override
    void addCondiments() {

    }
}
SoyaMilk puryMilk = new PurSoyaMilk();
puryMilk.make();

由此可以看出钩子方法,是返回一个布尔值,决定模板中某个方法要不要执行。

在springIOC中使用模板方法模式。有机会给这个文章深入剖析一下。

展开阅读全文

页面更新:2024-06-20

标签:模板   模式   方法   子类   钩子   黄豆   骨架   上好   豆浆   大豆   抽象   花生   算法   步骤   定义   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top