• 1. 模板方法模式 —手机制造
  • 2. 手机制造分4个部分。如上图所示。例:手 机SMT测试组装包装
  • 3. 定义: 模板方法模式是行为型模式。 定义一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。不管是哪种手机,其制造过程必有这4个步骤。由此我们引入模板方法模式。
  • 4. 结构如下:涉及角色:抽象模板(Abstract Template)角色, 具体模板(Concrete Template)角色
  • 5. 现在要生产两款手机。 将事例与模板方法模式对应。
  • 6. 下面是代码实现: public abstract class PhoneManufacture{ public abstract void SMT(); public abstract void Test(); public abstract void Assembly(); public abstract void Package(); public void ManuProcess(){ SMT(); Test(); Assembly(); Package(); } }PhoneManufacture部分
  • 7. public class PhoneHW extends PhoneManufacture{ public void SMT(){ System.out.println("HW光板物料贴片,高温烘烤..."); } public void Test(){ System.out.println("HW主板进行核心功能测试..."); } public void Assembly(){ System.out.println("HW主板与LCD等主物料组装为裸机..."); } public void Package(){ System.out.println("HW裸机与电板等附件进行包装..."); } }PhoneHW部分
  • 8. public class PhoneSkyTouch extends PhoneManufacture{ public void SMT(){ System.out.println("SkyTouch光板物料贴片,高温烘烤..."); } public void Test(){ System.out.println("SkyTouch主板进行核心功能测试..."); } public void Assembly(){ System.out.println("SkyTouch主板与LCD等主物料组装为裸机..."); } public void Package(){ System.out.println("SkyTouch裸机与电板等附件进行包装..."); } }PhoneSkyTouch部分
  • 9. public static void main(String[] args) { PhoneManufacture HW = new PhoneHW(); HW.ManuProcess(); PhoneManufacture SkyTouch = new PhoneSkyTouch(); SkyTouch.ManuProcess(); }客户端部分及输出结果
  • 10. 注意到PhoneHW和PhoneSkyTouch两者的SMT、Test、Assembly、Package其实都差不多,可以提取共同代码到父类。对父类稍作修改得到:public static abstract class PhoneManufacture{ public void SMT(){ System.out.println(getName()+"光板物料贴片,高温烘烤..."); } public void Test(){ System.out.println(getName()+"主板进行核心功能测试..."); } public void Assembly(){ System.out.println(getName()+"主板与LCD等主物料组装为裸机..."); } public void Package(){ System.out.println(getName()+"裸机与电板等附件进行包装..."); } public void ManuProcess(){ SMT(); Test(); Assembly(); Package(); } public abstract String getName(); }
  • 11. 则PhoneHW和PhoneSkyTouch精简为:public static class PhoneHW extends PhoneManufacture{ protected String getName(){ return "HW"; } } public static class PhoneSkyTouch extends PhoneManufacture{ protected String getName(){ return "SkyTouch"; } }客户端无需改动,显示结果依旧。
  • 12. 模板方法模式优点: 封装不变的部分,扩展可变的部分。 不变的部分封装到父类实现,可变部分则可以通过继承进行扩展。 提取公共部分代码,便于维护。 将公共部分的代码抽取出来放在父类中,维护时只需要修改父类中的代码。 行为由父类控制,子类实现。 基本方法是由子类实现的,因此子类可以通过扩展增加相应的功能,符合开闭原则。
  • 13. 模板方法模式缺点: 一般情况下,抽象类负责声明最抽象、最一般的事物属性和方法,实现类完成具体的事物属性和方法。 模板方法模式刚好相反,抽象类定义部分抽象方法,由子类实现,子类执行的结果影响了父类的结果,也就是子类对父类产生了影响。在复杂项目中,会增加代码阅读的难度。
  • 14. 模板方法模式使用场景: 多个子类有公有方法,并且逻辑基本相同时。 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。 重构时,模板方法模式是常用的模式,将相同的代码抽取到父类中。
  • 15. Thank You !