一、基础简介
1、定义
为子系统中的一组接口提供一个一致的界面;
定义一个高层接口,使得这一子系统更加容易使用
2、使用场景
- 1、为复杂的模块或子系统提供外界访问的模块。
- 2、降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口。
3、优缺点
外观(Facade)模式是“迪米特法则”的典型应用,它有以下主要优点。
- 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。
- 对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。
- 降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程,因为编译一个子系统不会影响其他的子系统,也不会影响外观对象。
外观(Facade)模式的主要缺点如下。
- 不能很好地限制客户使用子系统类。
- 增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。
4、结构图
外观(Facade)模式包含以下主要角色。
- 外观(Facade)角色:为多个子系统对外提供一个共同的接口。
- 子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它。
- 客户(Client)角色:通过一个外观角色访问各个子系统的功能。
二、“买房”的外观模式实例
1、“买房”的过程图
在买房的过程中,客户的操作是比较繁琐的,这个时候找到Facade外观类(也就是现实生活中的中介),就可以简单的搞定
2、SubSystem 子系统角色
package com.mfc.design.外观模式;
/**
* @author MouFangCai
* @date 2019/10/14 15:21
*/
public class SubSystem01_SelectRoom {
public void selectRoom(){
System.out.println("客户选择好了房源");
}
}
package com.mfc.design.外观模式;
/**
* @author MouFangCai
* @date 2019/10/14 15:21
*/
public class SubSystem02_Sign {
public void sign(){
System.out.println("签订购房合同");
}
}
package com.mfc.design.外观模式;
/**
* @author MouFangCai
* @date 2019/10/14 15:21
*/
public class SubSystem03_Procedure {
public void procedure(){
System.out.println("办理一系列手续");
}
}
package com.mfc.design.外观模式;
/**
* @author MouFangCai
* @date 2019/10/14 15:21
*/
public class SubSystem04_Tollage {
public void tollage(){
System.out.println("交税");
}
}
package com.mfc.design.外观模式;
/**
* @author MouFangCai
* @date 2019/10/14 15:21
*/
public class SubSystem05_Credential {
public void credential(){
System.out.println("拿到房产证");
}
}
3、Facade
package com.mfc.design.外观模式;
/**
* @author MouFangCai
* @date 2019/10/14 15:37
*/
public class Facade_BuyRoom {
private SubSystem01_SelectRoom selectRoom;
private SubSystem02_Sign sign;
private SubSystem03_Procedure procedure;
private SubSystem04_Tollage tollage;
private SubSystem05_Credential credential;
// 需要知道子系统的细节
public Facade_BuyRoom() {
selectRoom = new SubSystem01_SelectRoom();
sign = new SubSystem02_Sign();
procedure = new SubSystem03_Procedure();
tollage = new SubSystem04_Tollage();
credential = new SubSystem05_Credential();
}
public void buyRoom(){
System.out.println("买房开始");
selectRoom.selectRoom();
sign.sign();
procedure.procedure();
tollage.tollage();
credential.credential();
System.out.println("买房结束");
}
}
4、Client_Facade
package com.mfc.design.外观模式;
/**
* @author MouFangCai
* @date 2019/10/14 15:46
*/
public class Client_Facade {
public static void main(String[] args) {
Facade_BuyRoom facade_buyRoom = new Facade_BuyRoom();
facade_buyRoom.buyRoom();
}
}
5、结果
买房开始
客户选择好了房源
签订购房合同
办理一系列手续
交税
拿到房产证
买房结束Process finished with exit code 0
网友评论