外观模式:简化接口
我们通常在完成某一个流程操作时候,需要调用很多接口,我们可以对这些接口进行封装,提供一个简化接口
未引入外观模式例子
早上出门,我们需要完成一些步骤
对应代码
package headfirst.hd.facade.eg.error;
public class Eatable {
public void eat() {
System.out.println("吃饭");
}
}
package headfirst.hd.facade.eg.error;
public class GetUpable {
public void getUp() {
System.out.println("起床");
}
}
package headfirst.hd.facade.eg.error;
public class Washable {
public void wash() {
System.out.println("洗漱");
}
}
客户代码Client
package headfirst.hd.facade.eg.error;
public class Client {
public static void main(String[] args) {
GetUpable getUpable = new GetUpable();
Washable washable = new Washable();
Eatable eatable = new Eatable();
//客户必须知道所调用接口的先后顺序,例如,先起床,后洗漱
getUpable.getUp();
washable.wash();
eatable.eat();
}
}
测试结果
起床
洗漱
吃饭
此实现方式注意事项:
- 客户必须知道所调用的所有接口
- 客户必须知道所调用接口的先后顺序,例如,先起床,后洗漱
引入外观模式例子
早上出门,我们需要完成一些步骤
对应修改代码
package headfirst.hd.facade.eg.error;
public class GoOut {
public void goOut() {
GetUpable getUpable = new GetUpable();
Washable washable = new Washable();
Eatable eatable = new Eatable();
//负责调用接口的先后顺序,为客户屏蔽掉这些细节
getUpable.getUp();
washable.wash();
eatable.eat();
}
}
package headfirst.hd.facade.eg.error;
public class Client {
public static void main(String[] args) {
//只用调用这个简化接口
GoOut goOut = new GoOut();
goOut.goOut();
}
}
测试结果
起床
洗漱
吃饭
外观模式:简化接口,为客户屏蔽掉细节
复杂的外观模式
层层外观,这也是平时我们写代码分层思想
适配器模式与外观模式的区别
是否可以理解为适配器模式包装了一个类,外观模式可以包装多个类
错误,上面理解只是从代码表现上来理解
因为适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
外观模式仅仅是提供一个调用统一接口,并不会改变接口类型,仅仅是为了简化接口,屏蔽掉客户Client需要知道的许多细节
外观模式是一个比较简单的模式