23种设计模式之外观模式

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

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

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

/**
 * 这是一个食物接口
 */

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种设计模式之外观模式)