您当前的位置: 首页 > 

liaowenxiong

暂无认证

  • 0浏览

    0关注

    1171博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

设计模式之模板模式

liaowenxiong 发布时间:2022-06-07 23:57:56 ,浏览量:0

文章目录
  • 简介
  • 演示案例
    • 案例一(制作菜品)
    • 案例二(银行业务办理)

简介

某个业务流程中,有些步骤或内容是固定不变的,那么这些步骤或内容就没有必要每次实现的时候都去重复实现,而应该是设计成模板,让使用者直接使用即可。而不能确定的步骤或内容,又允许让使用者根据自己的需求去实现,这就是“模板模式”的设计思想

在 Java 编程中,模板设计模式是通过抽象类来实现的,因为抽象类体现的就是“部分实现,部分抽象”这样的思想。

模板模式的好处:可以极大的简化代码和提高代码的重用性,从而提高开发效率。

模板方法(抽象类中已经实现的方法)通常会加上 final 关键字,防止被子类重写。

模板模式使用场景:当要完成某个过程,该过程要执行一系列的步骤,这一系列的步骤是固定不变的,只是个别步骤中的具体实现因为不同的业务有所不同,这种情况可以考虑使用模板模式来开发。

演示案例 案例一(制作菜品)

制作菜品的流程都相同:准备原材料、烹饪、上菜,只是三个步骤中的具体内容不同而已,那么就可以将制作菜品这件事抽象成一个抽象类,而三个步骤则抽象成三个抽象方法,并且再将制作菜品的标准流程抽象成一个具体方法,这个具体方法中去运行三个步骤对应的方法。

那么制作西红柿炒蛋这件事也抽象成一个类,这个类去继承抽象类,然后实现其中的三个抽象方法(步骤方法);同样地制作葱花豆腐这件事也抽象成一个类,也去继承抽象类,实现其中的三个抽象方法。那么抽象类中的具体方法也被继承到实现子类中了,也就是说西红柿炒蛋这个类就拥有了制作菜品的方法了,葱花豆腐也拥有了制作菜品的方法,需要制作菜品时就只要调用制作菜品的方法就可以了。

注:在这个案例中,可以将抽象类理解为模板,而抽象类中的具体方法理解为模板方法。

模板抽象类的代码:

package priv.lwx.design.template;

/**
 * 设计模式之 - 模板模式的演示
 * 该抽象类用来设计做菜品的标准流程(制作菜品的流程模板)
 *
 * @author liaowenxiong
 * @date 2022/6/5 16:32
 */

public abstract class Cooking {
  /**
   * 准备材料
   *
   * @param
   * @return
   * @throws
   * @author liaowenxiong
   * @date 2022/6/5 16:39
   */
  public abstract String[] prepareMaterials();

  /**
   * 烹饪
   *
   * @param materials
   * @return String
   * @throws
   * @author liaowenxiong
   * @date 2022/6/5 16:58
   */
  public abstract String cook(String[] materials);

  /**
   * 上菜
   *
   * @param dish
   * @return
   * @throws
   * @author liaowenxiong
   * @date 2022/6/5 16:59
   */
  public abstract void serveDishes(String dish);

  /**
   * 制作菜品
   *
   * @param
   * @return
   * @throws
   * @author liaowenxiong
   * @date 2022/6/5 16:59
   */
  public void makeDish() {
    String[] materials = prepareMaterials();
    String dish = cook(materials);
    serveDishes(dish);
  }
}

制作西红柿炒蛋的代码:

package priv.lwx.design.service;

import priv.lwx.design.template.Cooking;

/**
 * 制作番茄炒蛋
 *
 * @author liaowenxiong
 * @date 2022/6/5 21:04
 */

public class TomatoOmelette extends Cooking {
  /**
   * 准备食材
   *
   * @param
   * @return String[]
   * @throws
   * @author liaowenxiong
   * @date 2022/6/6 10:19
   */
  @Override
  public String[] prepareMaterials() {
    return new String[]{"tomato", "omelette"};
  }

  /**
   * 烹饪
   *
   * @param materials
   * @return String
   * @throws
   * @author liaowenxiong
   * @date 2022/6/6 10:19
   */
  @Override
  public String cook(String[] materials) {
    String dish = "";
    for (int i = 0; i = 1000) {
      System.out.println("-- 办理取款业务 --");
      System.out.println("取款金额:" + (Integer) obj);
      result = 0;
    } else if ((Integer) obj = 500) {
      System.out.println("-- 办理取款业务 --");
      System.out.println("取款金额:" + (Integer) obj);
      result = 1;
    } else {
      System.out.println("-- 办理取款业务 --");
      System.out.println("取款金额:" + (Integer) obj);
      result = 2;
    }
    return result;
  }
}

关注
打赏
1661566967
查看更多评论
立即登录/注册

微信扫码登录

0.0644s