23种设计模式之模板方法模式

2019-01-27  本文已影响0人  阿跳爱学习

优点: 封装不变部分,扩展可变部分,灵活度高,便于扩展。

缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

主要用于整体步骤固定,某些部分易变,可把易变方法抽象出来,供子类实现。

例子:比如节假日下馆子吃饭,排队,点菜吃饭,结账,流程骨架都是一样的,但是点菜吃饭却是抽象的,比如中秋节我吃中秋团圆套餐,国庆节我吃满汉全席,像点菜吃饭这个方法就属于易变部分,所以可以使用模板方法模式去解决这个问题,把易变部分抽象出来,供子类实现。

创建一个抽象类,模板方法加上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

骨架结构是一样的,只是抽象方法实现了不一样的业务流程。

已完成测试!有不对的地方欢迎指出,感恩。

上一篇下一篇

猜你喜欢

热点阅读