优点:为子系统提供统一的入口,封装子系统的复杂性,以便客户端调用。
缺点:不符合开闭原则。
例子:比如我要吃饭,饭桌上有肉,有米饭,有蔬菜,有甜品,按照操作逻辑,我需要煮肉,酿酒,煮蔬菜,做甜品,这些东西都比较复杂,我需要和所有的东西都打交道,但是如果我去餐厅吃呢?是不是有服务员?想吃什么告诉服务员就行了,跟本就不需要知道这些东西复杂的制作流程,服务员就是属于一个外观模式。
想创建一个食物接口,包含一个食材方法:
/**
* 这是一个食物接口
*/
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
这样调用者就方便多了。
已完成测试!有不对的地方欢迎指出,感恩。
网友评论