美文网首页
23种设计模式之外观模式

23种设计模式之外观模式

作者: 阿跳爱学习 | 来源:发表于2019-01-09 19:21 被阅读0次

    优点:为子系统提供统一的入口,封装子系统的复杂性,以便客户端调用。
    缺点:不符合开闭原则。

    例子:比如我要吃饭,饭桌上有肉,有米饭,有蔬菜,有甜品,按照操作逻辑,我需要煮肉,酿酒,煮蔬菜,做甜品,这些东西都比较复杂,我需要和所有的东西都打交道,但是如果我去餐厅吃呢?是不是有服务员?想吃什么告诉服务员就行了,跟本就不需要知道这些东西复杂的制作流程,服务员就是属于一个外观模式。

    想创建一个食物接口,包含一个食材方法:

    /**
     * 这是一个食物接口
     */
    
    public interface Food {
        void ingredients();
    }
    

    然后创建其他实体类。
    肉:

    import android.util.Log;
    
    /**
     * 这是一个肉实体类
     */
    
    public class Meat implements Food {
    
        @Override
        public void ingredients() {
            Log.d("TAG", "肉");
        }
    }
    

    米饭:

    import android.util.Log;
    
    /**
     * 这是一个米饭实体类
     */
    
    public class Rice implements Food{
    
        @Override
        public void ingredients() {
            Log.d("TAG","米饭");
        }
    }
    

    蔬菜:

    /**
     * 这是一个蔬菜实体类
     */
    
    public class Vegetables implements Food {
    
        @Override
        public void ingredients() {
            Log.d("TAG", "蔬菜");
        }
    }
    

    甜品:

    import android.util.Log;
    
    /**
     * 这是一个甜品实体类
     */
    
    public class Dessert implements Food {
    
        @Override
        public void ingredients() {
            Log.d("TAG","甜品");
        }
    }
    

    试试不用外观模式调用:

    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.support.v4.app.FragmentActivity;
    import android.util.Log;
    
    /**
     * 这是调用者
     */
    
    public class MainActivity extends FragmentActivity {
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Log.d("TAG", "我要做---------------------------");
    
            //肉
            Food meat = new Meat();
            meat.ingredients();
    
            //米饭
            Food rice = new Rice();
            rice.ingredients();
    
            //蔬菜
            Food vegetables = new Vegetables();
            vegetables.ingredients();
    
            //甜品
            Food dessert = new Dessert();
            dessert.ingredients();
    
            Log.d("TAG", "就这么多---------------------------");
        }
    }
    
    结果: image.png

    这样比较麻烦,我需要和所有想吃的东西打交道,都得自己去做,去餐厅吃了。

    创建一个服务员类,把所有要自己做的东西丢给服务员做就行:

    /**
     * 这是一个服务员实体类
     */
    
    public class Waiter {
    
        public void service() {
            //肉
            Food meat = new Meat();
            meat.ingredients();
    
            //米饭
            Food rice = new Rice();
            rice.ingredients();
    
            //蔬菜
            Food vegetables = new Vegetables();
            vegetables.ingredients();
    
            //甜品
            Food dessert = new Dessert();
            dessert.ingredients();
        }
    }
    

    调用:

    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.support.v4.app.FragmentActivity;
    import android.util.Log;
    
    /**
     * 这是调用者
     */
    
    public class MainActivity extends FragmentActivity {
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Log.d("TAG", "您好,我要点菜---------------------------");
    
            new Waiter().service();
    
            Log.d("TAG", "就这么多---------------------------");
        }
    }
    
    结果: image.png

    这样调用者就方便多了。
    已完成测试!有不对的地方欢迎指出,感恩。

    相关文章

      网友评论

          本文标题:23种设计模式之外观模式

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