模板模式

模板模式

    模板模式:一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,这种设计方式将一些步骤延迟到子类实现,但是子类却可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

    模板方法为我们提供了一种代码复用的技巧,模板方法的抽象类可以定义具体方法、抽象方法和钩子。抽象方法由子类实现,钩子是一种方法,它可以不做任何事情,或者只做默认的事情,由子类决定是否覆盖这个方法。

   下面举个例子来阐述一下这个设计模式。

   比如说你和你对象去口渴了店里买饮料喝,一个要金桔柠檬,一个要珍珠奶茶。我们来想一下饮料的制作过程。

金桔柠檬:                                            珍珠奶茶:

1、把水倒入容器中                             1、把水倒进容器

2、加柠檬 、椰果等                             2、加调料(奶茶、珍珠等)

3、搅拌                                                3、搅拌

我们来用代码实现这些操作步骤:

/**
 * 金桔柠檬
 */
public class Lemon {
    //倒水
    public void pourWater(){};
    //加柠檬
    public void pourLemon(){};
    //搅拌
    public void stir(){}
}

/**
 * 奶茶
 */
public class MilkTea {
    //倒水
    public void pourWater(){};
    //加珍珠
    public void pourPearl(){};
    //搅拌
    public void stir(){}
}

 

    金桔柠檬和奶茶的制作有相同的地方,我们把这些共性进一步抽象,定义一个抽象类,将这些共性的东西,比如说倒水喝搅拌的动作,不希望子类修改的用final来修饰,而放调料由子类决定需要哪些调料,定义成抽象的方法,让子类必须去实现它。

public abstract class MakeDrink {
    //倒水
    public final  void pourWater(){ };
    //搅拌
    public final void stir(){};
  //加调料
    public abstract void putSomething();

}

/**
 * 奶茶
 */
public class MilkTea extends MakeDrink{

    @Override
    public void putSomething() {
        System.out.println("放珍珠");
    }
}


/**
 * 金桔柠檬
 */
public class Lemon extends MakeDrink{


    @Override
    public void putSomething() {
        System.out.println("放柠檬");
    }
}

这就是一个简单的模板模式的应用。

    好的,饮料制作好了,服务人员问你是打包还是现在就喝,你的对象说打包,但是你现在就想喝,那么可以在定义一个默认的方法,做一些默认的事情,比如说给你包装好,喝不喝随你,你可以重写这个方法,也可以选着不重写,这就是钩子。

我们在抽象类里面再加个打包的方法,Lemon类重写这个方法,而MilkTea采用父类默认的方法。

public abstract class MakeDrink {
    //倒水
    public final  void pourWater(){ };
    //搅拌
    public final void stir(){};

    public abstract void putSomething();
    public void packageDrink(){
        System.out.println("打包好了");
    }

}

/**
 * 金桔柠檬
 */
public class Lemon extends MakeDrink{


    @Override
    public void putSomething() {
        System.out.println("放柠檬");
    }

    @Override
    public void packageDrink(){
        System.out.println("我现在就喝");
    }
}

   我们平时代码开发经常用到这种模式,一些框架用到的也非常多,像Spring的JDBCTemplate。使用模板模式能够将代码的复用最大化,算法只存在于一个地方,容易修改。

 

转载于:https://www.cnblogs.com/JackSparrow-/p/10713978.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
模板模式是一种行为设计模式,它定义了一个操作中的算法的骨架,将一些步骤延迟到子类中。模板模式使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。在Java中,模板模式通常由一个抽象类和一个或多个实现类组成。抽象类中定义了一个模板方法,该方法包含了算法的骨架,以及一些抽象方法,这些抽象方法由子类实现,以完成算法中的具体步骤。 以下是Java模板模式的一个示例: ```java // 抽象类 abstract class Game { abstract void initialize(); abstract void startPlay(); abstract void endPlay(); // 模板方法 public final void play(){ // 初始化游戏 initialize(); // 开始游戏 startPlay(); // 结束游戏 endPlay(); } } // 实现类1 class Cricket extends Game { @Override void endPlay() { System.out.println("Cricket Game Finished!"); } @Override void initialize() { System.out.println("Cricket Game Initialized! Start playing."); } @Override void startPlay() { System.out.println("Cricket Game Started. Enjoy the game!"); } } // 实现类2 class Football extends Game { @Override void endPlay() { System.out.println("Football Game Finished!"); } @Override void initialize() { System.out.println("Football Game Initialized! Start playing."); } @Override void startPlay() { System.out.println("Football Game Started. Enjoy the game!"); } } // 演示类 public class TemplatePatternDemo { public static void main(String[] args) { Game game = new Cricket(); game.play(); System.out.println(); game = new Football(); game.play(); } } ``` 输出结果为: ``` Cricket Game Initialized! Start playing. Cricket Game Started. Enjoy the game! Cricket Game Finished! Football Game Initialized! Start playing. Football Game Started. Enjoy the game! Football Game Finished! ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值