说明:本文介绍设计模式中结构型设计模式中的,外观模式;
亲手下厨还是点外卖?
外观模式属于结构型的设计模式,关注类或对象的组合,所呈现出来的结构。以吃饭为例,在介绍外观模式之前,通过这个例子,谈谈我对面向对象的理解。
吃饭,是一个功能,可以有两种方式来实现,对应的正是面向过程和面向对象的思想。
第一种,自己买菜买工具(初始化变量),做饭(实现方法),吃饭(实现方法),洗碗卖工具(释放内存空间);
第二种,点外卖(手机对象),做饭(店家对象),送外卖(外卖员对象),吃饭(顾客对象);
通过比较,就很容易理解两种设计思想了。实际上就是实现功能的思路,一种是将功能分为一步一步,逐步实现(面向过程);一种是将属性和行为封装为对象,让功能的实现在对象的交互中实现。
这两种解题思路,没有高低之分,也没有哪种更优秀,殊途同归。
外观模式
以上面吃饭为例,面向对象设计,如下:
(Vegetables,蔬菜对象,提供蔬菜)
/**
* 蔬菜对象
*/
public class Vegetables {
public void provide() {
System.out.println("提供蔬菜");
}
}
(Cook,厨师对象,做饭)
/**
* 厨师
*/
public class Cook {
public void cook() {
System.out.println("做饭");
}
}
(用餐者对象,吃饭,吃完饭洗碗)
/**
* 食客
*/
public class Diners {
public void eat() {
System.out.println("吃饭");
}
public void wash() {
System.out.println("洗碗");
}
}
(Client,客户端,演示吃饭功能)
/**
* 客户端
*/
public class Client {
public static void main(String[] args) {
new Vegetables().provide();
new Cook().cook();
new Diners().eat();
new Diners().wash();
}
}
(执行结果)
通过上面的例子,我们可以看出,实现一个功能涉及到多个对象的配合,那为什么我们不把这些对象中对应的功能(方法)绑定到一起,合并成一个业务层面上的功能(吃饭)呢?
如下:
(EatFacede,吃饭外观类,捆绑各个对象的方法,实现吃饭功能)
/**
* 吃饭外观类
*/
public class EatFacede {
/**
* 蔬菜对象
*/
private Vegetables vegetables;
/**
* 厨师对象
*/
private Cook cook;
/**
* 食客对象
*/
private Diners diners;
public EatFacede() {
vegetables = new Vegetables();
cook = new Cook();
diners = new Diners();
}
/**
* 吃饭
*/
public void eat() {
vegetables.provide();
cook.cook();
diners.eat();
diners.wash();
}
}
(Client,客户端,演示吃饭流程,只需要调用吃饭外观类中的eat()方法即可)
/**
* 客户端
*/
public class Client {
public static void main(String[] args) {
new EatFacede().eat();
}
}
(执行结果)
以上就是结构型设计模式中,外观模式的内容。这种将繁多的对象方法合并到一起,实现一项“大功能”的思路与生活经验非常贴合。例如开公司,公司的合伙人一边有资金,一边有技术,聚在一起开公司干大事。
另外,在三层框架开发中,Controller层只管调用Service层中的一个方法,而在Service层中,该方法内可能去调用了其他Bean对象的方法,最终才实现了本Service中的这个功能,这也是外观模式的体现。
总结
本文参考《设计模式的艺术》、《秒懂设计模式》两书