优点: 封装不变部分,扩展可变部分,灵活度高,便于扩展。
缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
主要用于整体步骤固定,某些部分易变,可把易变方法抽象出来,供子类实现。
例子:比如节假日下馆子吃饭,排队,点菜吃饭,结账,流程骨架都是一样的,但是点菜吃饭却是抽象的,比如中秋节我吃中秋团圆套餐,国庆节我吃满汉全席,像点菜吃饭这个方法就属于易变部分,所以可以使用模板方法模式去解决这个问题,把易变部分抽象出来,供子类实现。
创建一个抽象类,模板方法加上final,让子类不可重写:
import android.util.Log;
/**
*这是一个餐厅抽象类
*/
public abstract class Restaurant {
//具体方法
public void queue(){
Log.d("TAG","排队");
}
public abstract void eat();
public void settlement(){
Log.d("TAG","结账!");
}
//模板方法,子类不可重写
public final void process(){
this.queue();
this.eat();
this.settlement();
}
}
创建中秋节实体类,并继承Restaurant 抽象类:
import android.util.Log;
/**
* 中秋节实体类
*/
public class MidAutumnFestival extends Restaurant {
@Override
public void eat() {
Log.d("TAG","来一份团圆套餐!");
}
}
创建国庆节实体类,并继承Restaurant 抽象类:
import android.util.Log;
/**
* 国庆节实体类
*/
public class NationalDay extends Restaurant{
@Override
public void eat() {
Log.d("TAG","上满汉全席");
}
}
调用:
/**
* 这是调用者
*/
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Restaurant restaurant1 = new MidAutumnFestival();
restaurant1.process();
Restaurant restaurant2 = new NationalDay();
restaurant2.process();
}
}
结果:
image.png
骨架结构是一样的,只是抽象方法实现了不一样的业务流程。
已完成测试!有不对的地方欢迎指出,感恩。
网友评论