这个可以类比填表单,事务的流程是清晰的,部分过程是抽象的,需要具体实现类自己实现。
方法:
用抽象基类定义框架
1.创建抽象类
—public abstract class RefreshBeverage
2.创建模版方法 一定要用final因为要禁止子类对方法框架的覆写
—public final void prepareBeverageTemplate()
—boilWater();
—brew();
—pourInCup();
—addCondiments();
3.实现并私有化基本方法
—private
4.添加抽象的基本方法
—protected abstract
- 定义一个公共的抽象父类
- 定义一个公共 final 的方法(封装所有子类都要遵循的算法框架)
- 算法框架中定义的方法子类实现相同的使用 private 修饰该方法并且实现,子类实现方法不一样的使用 protected abstact 修饰该方法并且不实现
- 让子类重写父类未实现的方法,实现各自的方法
- 在调用的实例对象采用 父类 实例名 = new 子类,在直接调用遵循的框架方法。
实现钩子函数,以达到控制实现分支的作用.
用钩子函数实现子类对算法框架个性化的扩展
钩子
1、框架通过提供一个个的钩子,使框架具备了更大的灵活性。不想执行算法框架中的某些个步骤,我们可以脱钩,如果想执行的话,我们可以挂钩。
实现
2、在抽象类中,提供protected钩子方法。这是个实现的或空的方法。这样子类就可以选择覆写-持钩,也可以选择不覆写-脱勾。
使用
3、提供一个isXXX类型的钩子方法。用该方法控制算法框架中
某个步骤是否执行
4、子类不覆写这个方法,就是脱钩,仍按框架逻辑执行,一旦覆写,就是挂钩,将改变框架算法方向,按子类逻辑执行。
/*
* 抽象基类,为所有子类提供一个算法框架
*
* 提神饮料
*/
public abstract class RefreshBeverage {
/*
* 制备饮料的模板方法
* 封装了所有子类共同遵循的算法框架
*/
public final void prepareBeverageTemplate(){
//步骤1 将水煮沸
boilWater();
//步骤2 泡制饮料
brew();
//步骤3 将饮料倒入杯中
pourInCup();
if(isCustomerWantsCondiments()){
//步骤4 加入调味料
addCondiments();
}
}
/*
* Hook, 钩子函数,提供一个默认或空的实现
* 具体的子类可以自行决定是否挂钩以及如何挂钩
* 询问用户是否加入调料
*/
protected boolean isCustomerWantsCondiments() {
return true;
}
/*
* 基本方法,将水煮沸
*/
private void boilWater() {
System.out.println("将水煮沸");
}
/*
* 基本方法,将饮料倒入杯中
*/
private void pourInCup() {
System.out.println("将饮料倒入杯中");
}
/*
* 抽象的基本方法,泡制饮料
*/
protected abstract void brew();
/*
* 抽象的基本方法, 加入调味料
*/
protected abstract void addCondiments();
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-14 14:13:43