抽象模板模式
来源:互联网 发布:java 高仿京东商城 编辑:程序博客网 时间:2024/05/21 22:55
**
模板方法模式
**
定义一个操作算法的骨架,将一些不住延迟到子类中;
- 抽象模板:
定义一个抽象算法的骨架,将其他一些操作延迟加载到子类中
定义多个抽象操作,以便让子类实现
实现一个模板,作为子类公用
定义钩子,做业务扩展牵引 - 具体模板
实现父类定义的一个或多个抽象方法
可以任意多个子类实现模板
每个具体实现可以以不同方式实现模板方法
例子
实现生活中例子: 冲coffee: 烧水 ---》冲coffee ---》装杯 ---》添加牛奶 泡茶: 烧水 ---》泡茶 ---》装杯 ---》添加柠檬模板类/* * 抽象模板类 */public abstract class Beverage { /* * 模板方法,定义步骤,封装了所有子类将实现的算法框架 * 模板方法不可改变 */ public final void makeTemlate(){ /* * 烧水 */ System.out.println("step 1:"); boilWater(); /* * 泡制饮料 */ System.out.println("step 2:"); brew(); /* * 倒入杯中 */ System.out.println("step 3:"); pourIn(); /* * 添加佐料 */ if(isNeed()){ System.out.println("step 4:"); addCondiment(); } } /* * 钩子方法,实现一个空或者默认方法 * 具体子类可以根据业务定义如何挂钩 */ protected boolean isNeed() { return true; } /* * 烧水 ,基本方法 * private 保证基本方法不会被覆盖 */ private void boilWater() { System.out.println("把水烧开"); } /* * 制造饮料 */ protected abstract void brew(); /* * 倒入杯中,基本方法 * propected 保证能被子类继承的前提下还满足最少知道原则 */ protected void pourIn() { System.out.println("倒入杯中"); } /* * 添加佐料 */ protected abstract void addCondiment();}coffee类public class Coffee extends Beverage { @Override protected void addCondiment() { System.out.println("添加牛奶"); } @Override protected void brew() { System.out.println("用水冲制coffee"); } /* * 子类自定义的钩子方法,实现对业务的控制 */ @Override protected boolean isNeed(){ return false; }}tea类/* * 具体子类 ,实现茶的制作方式 */public class Tea extends Beverage { @Override protected void brew() { System.out.println("泡制茶水"); } @Override protected void addCondiment() { System.out.println("加入柠檬"); }}app使用public class App { public static void main(String[] args) { System.out.println("开始制造咖啡..."); Beverage coffee = new Coffee(); coffee.makeTemlate(); System.out.println("咖啡制造完成,请慢用!"); System.out.println("--------------line----------------"); System.out.println("开始制造茶..."); Beverage Tea = new Tea(); Tea.makeTemlate(); System.out.println("茶制造完成,请慢用!"); }}//结果如下开始制造咖啡...step 1:把水烧开step 2:用水冲制coffeestep 3:倒入杯中咖啡制造完成,请慢用!-------------------line-------------------开始制造茶...step 1:把水烧开step 2:泡制茶水step 3:倒入杯中step 4:加入柠檬茶制造完成,请慢用!
优点
1.复用性:模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。
2.屏蔽细节:子类实现算法的某些细节,模板中看不出具体实现。
3.封装性:通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。
缺点
1.每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象,如果子类过多,会出现太多的类。
2.java只支持单继承,所以如果业务需要需要增加继续就很麻烦
适用场景
1.算法,操作相似的业务逻辑。
2.重构时发现相同的逻辑代码。
3.封装核心的算法
本文属于个人学习笔记,内容如有雷同,十分感谢大神分享0.0
1 0
- 模板模式-抽象模板
- 抽象模板模式
- 抽象类和模板模式
- 抽象类和模板模式
- 设计模式之抽象模板模式09
- 单例模式、工厂模式、抽象模式、模板方法模式
- 抽象类的体现-模板模式
- 利用抽象类实现模板设计模式
- 抽象类封装公共操作(模板模式)
- 从抽象类到模板方法模式
- Java中抽象继承(模板模式)
- 模板模式——多态、虚方法、抽象
- 设计模式-工厂方法 简单工厂 抽象工厂 模板方法
- 抽象类与接口与模板方法设计模式
- 黑马程序员_抽象类与模板方法设计模式
- 黑马程序员_抽象类&模板设计模式
- 《黑马程序员》 抽象类之模板设计模式
- JavaSE_12_利用抽象类实现模板设计模式
- 如何在Ubuntu中自定义键盘快捷[译]
- 线程同步方法、性能比较(synchronized,ReentrantLock,Atomic)
- 【codevs 1690】题解
- 事件委托
- linux修改TCP连接数(centos实测)
- 抽象模板模式
- springmvc---1
- 【使用CMake组织C++工程】0:CMake学习资源
- 无法远程连接mysql服务器
- Oracle 导入 IMP-00058错误及其他
- NSDictionary与NSMutableDictionary的基本使用
- DataGridView 控件详细解说
- 神奇的border属性
- Java集合类详解