一般纳税人企业所得税怎么征收福清seo
概念
模板方法模式是一种行为型设计模式,它定义了一个算法的骨架,允许子类在不改变算法结构的情况下重定义某些步骤。父类通过模板方法控制流程,子类通过实现抽象方法填充细节。
作用
1.代码复用:公共逻辑抽取到父类,避免重复代码。
2.扩展性:子类只需关注差异部分,符合开闭原则。
3.流程控制:父类固定核心流程,防止子类破坏执行顺序。
场景
1.多个类具有相似流程但部分步骤不同(如数据解析、文件处理)。
2.需要固定核心算法流程,允许子类扩展特定步骤。
3.框架设计(如Spring的JdbcTemplate)。
举例(饮料制作)
// 饮料类
abstract class Beverage {// 准备食谱:模板方法 (final防止子类覆盖)public final void prepareRecipe() {// 烧开水boilWater();// 泡brew();// 倒入杯子pourInCup();// 是否加入调味剂if (customerWantsCondiments()) {addCondiments();}}// 固定步骤:烧开水private void boilWater() {System.out.println("烧开水");}// 固定步骤:倒入杯子private void pourInCup() {System.out.println("倒入杯子");}// 抽象方法(必须实现)abstract void brew();abstract void addCondiments();// 钩子方法(可选覆盖)boolean customerWantsCondiments() {return true;}
}
class Coffee extends Beverage {@Overridevoid brew() {System.out.println("冲泡咖啡粉");}@Overridevoid addCondiments() {System.out.println("加糖和牛奶");}@Overrideboolean customerWantsCondiments() {return false; // 示例:咖啡不要调料}
}
class Tea extends Beverage {@Overridevoid brew() {System.out.println("浸泡茶叶");}@Overridevoid addCondiments() {System.out.println("加柠檬");}
}
优点和缺点
优点 | 缺点 |
代码复用率高 | 增加类数量(每个差异需一个子类) |
扩展性强(新增子类即可) | 父类修改可能影响所有子类 |
反向控制结构(父类调用子类) | 过度继承可能导致系统复杂 |
不使用模板方法的实现
class CoffeeWithoutPattern {public void makeCoffee() {System.out.println("烧开水");System.out.println("冲泡咖啡粉");System.out.println("倒入杯子");System.out.println("加糖和牛奶"); // 重复代码}
}
class TeaWithoutPattern {public void makeTea() {System.out.println("烧开水"); // 重复代码System.out.println("浸泡茶叶");System.out.println("倒入杯子"); // 重复代码System.out.println("加柠檬");}
}
存在的问题
1.重复代码:烧开水、倒杯子的代码重复。
2.维护困难:修改流程需改动所有类。
3.无法强制统一流程:子类可能遗漏步骤或改变顺序。
方案 | 代码量 | 扩展性 | 维护成本 | 流程控制 |
模板方法 | 少 | 高 | 低 | 严格统一 |
传统实现 | 多 | 低 | 高 | 自由松散 |
设计启示:当遇到多个相似流程的类时,优先使用模板方法模式消除重复代码,尤其适合需要严格流程控制的场景。