设计模式3-模板方法模式
定义
Template Method Partern:定义一个操作中的算法的框架(就是步骤),而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
通俗理解:父类规定流程,子类去做实现。
目的
● 代码复用
● 定义规范和约束
● 模板方法模式不仅仅是一种“复用代码”的技巧,更是一种定义框架、规范行为、实现松耦合的重要设计思想
场景
● 营业厅办理业务:取号=》办理业务=》柜台评价、每个人办理的业务不同可能是办卡、可能是转卡、转套餐、办宽带。
● 手机组装:装机的流程是固定的,装内部主板=》装电池=》装外壳=》测试手机
● 业务分摊:总公司的费用需要分摊到各个子公司
代码
// 模板方式方法-父类规定子类的行为
// 以营业厅办理业务:取号=》办理业务=》柜台评价为例
/*** 抽象模板类 - 定义业务办理流程的骨架*/
abstract class BusinessProcess {// 模板方法:定义了办理业务的固定流程。final防止子类重写整个流程。public final void handle() {takeNumber(); // 1. 取号 (固定步骤)processBusiness(); // 2. 办理业务 (抽象步骤,由子类实现)giveFeedback(); // 3. 评价 (固定步骤)}// 固定步骤1:取号private void takeNumber() {System.out.println(">>> 客户您好,请取号排队... [号码:A" + (int)(Math.random() * 100) + "]");}// 抽象方法:办理业务。留给子类去实现具体的业务逻辑。protected abstract void processBusiness();// 固定步骤3:评价private void giveFeedback() {System.out.println(">>> 业务办理完毕,请对我的服务做出评价(1-5星)。谢谢!");System.out.println("----------------------------------------");}
}/*** 具体子类 - 办理手机卡业务*/
class OpenCardBusiness extends BusinessProcess {@Overrideprotected void processBusiness() {// 实现办理手机卡的特有逻辑System.out.println(">>> 【核心业务】正在为您办理手机卡:");System.out.println(" - 验证身份证信息");System.out.println(" - 选择手机号码");System.out.println(" - 录入个人信息");System.out.println(" - 成功激活SIM卡");}
}/*** 具体子类 - 缴纳话费业务*/
class PayBillBusiness extends BusinessProcess {@Overrideprotected void processBusiness() {// 实现缴纳话费的特有逻辑System.out.println(">>> 【核心业务】正在为您缴纳话费:");System.out.println(" - 查询手机号码欠费金额");System.out.println(" - 接收客户付款");System.out.println(" - 系统充值到账");System.out.println(" - 打印缴费凭证");}
}/*** 客户端/测试类*/
class ClientTest {public static void main(String[] args) {System.out.println("===== 第一位客户:办理手机卡 =====");BusinessProcess openCard = new OpenCardBusiness();openCard.handle(); // 调用模板方法,开始固定流程System.out.println("===== 第二位客户:缴纳话费 =====");BusinessProcess payBill = new PayBillBusiness();payBill.handle(); // 调用模板方法,开始固定流程// 未来新增业务,比如"办理宽带",只需要再创建一个子类即可,无需修改现有流程。}
}
模板方式方法代码