模板方法模式
2015-11-12 11:41
344 查看
参考:《设计模式之禅》
实现方法:继承。
本质:父类建立框架,子类重写了父类的部分方法后,再调用从父类继承的方法,从而产生不同的结果。
以学生为例:
两个学生虽然大学里做的事不一样,但是终究要毕业。然而共同实现的毕业方法显得多余,应该在抽象中包括所有子类的共性。
修改如下:
抽象模板的方法两类:
1.子类实现的基本方法,在模板方法中被调用。
1.一个或多个,调用基本方法的一般为具体方法的模板方法,也就是一个框架,加上final不被修改。
优点:
1.封装不变部分,扩展可变部分。这样如果增加一个稍有不同的子类(学生)非常方便。
2.如果是公共方法出了问题,便于定位bug。
3.子类通过扩展增加相应的功能,符合开闭原则。
使用场景:
1.子类共有公共方法,并逻辑相同。
2.核心算法位模板方法,相关细节功能由子类实现。
+
实现方法:继承。
本质:父类建立框架,子类重写了父类的部分方法后,再调用从父类继承的方法,从而产生不同的结果。
以学生为例:
public abstract class Student { public abstract void love();//恋爱~ public abstract void study();//学习 public abstract void graduate();//毕业了! }
public class Student1 extends Student{ public void love(){ System.out.println("交了个美女!"); } public void study(){ System.out.println("学习不错啊!"); } public void graduate(){ this.love(); this.study(); } }
public class Student2 { public void love(){ System.out.println("因为玩游戏没有女朋友!"); } public void study(){ System.out.println("因为玩游戏是学渣"); } public void graduate(){ this.love(); this.study(); } }
两个学生虽然大学里做的事不一样,但是终究要毕业。然而共同实现的毕业方法显得多余,应该在抽象中包括所有子类的共性。
修改如下:
public abstract class Student { public abstract void love();//恋爱~ public abstract void study();//学习 public void graduate(){
this.love(); this.study();
}//毕业了!
}
public class Student1 extends Student{ public void love(){ System.out.println("交了个美女!"); } public void study(){ System.out.println("学习不错啊!"); } }
public class Student2 { public void love(){ System.out.println("因为玩游戏没有女朋友!"); } public void study(){ System.out.println("因为玩游戏是学渣"); } }
抽象模板的方法两类:
1.子类实现的基本方法,在模板方法中被调用。
1.一个或多个,调用基本方法的一般为具体方法的模板方法,也就是一个框架,加上final不被修改。
优点:
1.封装不变部分,扩展可变部分。这样如果增加一个稍有不同的子类(学生)非常方便。
2.如果是公共方法出了问题,便于定位bug。
3.子类通过扩展增加相应的功能,符合开闭原则。
使用场景:
1.子类共有公共方法,并逻辑相同。
2.核心算法位模板方法,相关细节功能由子类实现。
+
相关文章推荐
- centos 6.5防火墙配置
- Membership 用的哪个 Session 或 Cookie 存储会话
- 【Quartz】配置quartz数据源的三种方式
- ch340g
- Android-->ViewPager setPageTransformer的简单理解
- bzoj1088.扫雷Mine (模拟 || DP)
- Ajax知识总结
- ora-00031:session marked for kill处理oracle中杀不掉的锁
- python开发中module模块用法实例分析
- membership 常用的操作
- java.lang.OutOfMemoryError: PermGen space及其解决方法
- 在 Linux 中用 nmcli 命令绑定多块网卡
- 继承、实现、依赖、关联、聚合、组合的联系与区别
- linux -- framebuff驱动总结
- C#学习笔记 lambda表达式
- HDU 4946 (凸包)
- 序列化存档之备忘脚本
- win8.1 64位+oracle11g R2 64位 +powerdesigner破解版 64位+PL/SQL
- 支付宝支付
- jQuery提交Json数据到Webservice,并接收返回的Json数据