美文网首页
23种设计模式之模板方法模式

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

作者: 阿跳爱学习 | 来源:发表于2019-01-27 18:35 被阅读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

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

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

    相关文章

      网友评论

          本文标题:23种设计模式之模板方法模式

          本文链接:https://www.haomeiwen.com/subject/rdeijqtx.html