相关链接:
【设计模式】专栏:【设计模式】专栏
相关例子可下载: Java常用设计模式例子
外观模式
前言
在现实生活中,常常存在办事较复杂的例子,如办房产证或注册一家公司,有时要同多个部门联系,这时要是有一个综合部门能解决一切手续问题就好了。
如下图,图中给出了客户去当地房产局办理房产证过户要遇到的相关部门。
外观模式的定义和特点
外观模式(Facade Pattern)又叫作门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。
外观模式是“迪米特法则”的典型应用。
主要解决
降低访问复杂系统的内部子系统时的复杂度,简化客户端之间的接口。
优点
-
降低了子系统与客户端之间的耦合度,减少系统相互依赖,使得子系统的变化不会影响调用它的客户类
-
对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更容易。
-
降低了大型软件系统中的编译依赖性,简化了子系统在不同平台之间的移植过程,因为编译一个子系统不会影响其他子系统,也不会影响外观对象。
-
提高了灵活性
-
提高了安全性
缺点
-
不能很好地限制客户使用子系统类,很容易带来未知风险
-
增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”
外观模式的角色
外观模式的结构比较简单,它包含了对各个子系统的引用,客户端可以通过它访问各个子系统的功能。它包含的角色有:
外观(Facade)角色
为多个子系统对外提供一个共同的接口
子系统(Sub System)角色
实现系统的部分功能,客户可以通过外观角色访问它
客户(Client)角色
通过一个外观角色访问各个子系统的功能
示例代码
子系统角色
/**
* 外观模式——子系统
*
*/
public class SubSystem01 {
public void method01(){
System.out.println("子系统01被调用");
}
}
/**
* 外观模式——子系统
*
*/
public class SubSystem02 {
public void method02() {
System.out.println("子系统02被调用");
}
}
/**
* 外观模式——子系统
*
*/
public class SubSystem03 {
public void method03() {
System.out.println("子系统03倍调用");
}
}
外观角色
/**
* 外观模式——外观
*
*/
public class Facade {
/**
* 调用子系统
*/
public void method() {
// 调用子系统01
SubSystem01 system01 = new SubSystem01();
system01.method01();
// 调用子系统02
SubSystem02 system02 = new SubSystem02();
system02.method02();
// 调用子系统03
SubSystem03 system03 = new SubSystem03();
system03.method03();
}
}
客户角色
/**
* 外观模式——客户
*
*/
public class FacadePattern {
public static void main(String[] args) {
// 创建外观对象
Facade facade = new Facade();
// 利用外观对象调用各子系统
facade.method();
}
}
结束语
1、更多设计模式内容请看【设计模式】专栏
2、相关例子代码可下载: Java常用设计模式例子
PS: 【 Java常用设计模式例子 】 内已包含 【设计模式】专栏 里所涉及的代码,需要代码的同学可以下载哦,如果之前已下载过的同学,就不需要重复下载啦~
以上内容如有不正确或需要补充的地方,还请多多请教,会及时更新改正~
欢迎评论~ 感谢点赞~