网站首页 > java教程 正文
外观模式
软件设计中,当一个系统的功能越来越强,子系统会越来越多,客户对系统的访问也变得越来越复杂。这时如果系统内部发生改变,客户端也要跟着改变,这违背了“开闭原则”,也违背了“迪米特法则”,所以有必要为多个子系统提供一个统一的接口,从而降低系统的耦合度,这就是外观模式的目标。
定义:是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。
特点
优点:
- 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。
- 对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。
- 降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程,因为编译一个子系统不会影响其他的子系统,也不会影响外观对象。
缺点:
- 不能很好地限制客户使用子系统类。
- 增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。可以通过引入抽象外观类,在一定程度上解决该问题。
结构与示例
外观模式的结构比较简单,主要是定义了一个高层接口。它包含了对各个子系统的引用,客户端可以通过它访问各个子系统的功能。外观模式可分为简单外观模式和抽象外观模式,其类图结构如下:
简单外观模式代码如下:
SubSystemA.java
public class SubSystemA {
public void methodA() {
System.out.println("执行子系统A业务");
}
}
SubSystemB.java
public class SubSystemB {
public void methodB() {
System.out.println("执行子系统B业务");
}
}
SubSystemC.java
public class SubSystemC {
public void methodC() {
System.out.println("执行子系统C业务");
}
}
Facade.java
public class Facade {
private SubSystemA ssa;
private SubSystemB ssb;
private SubSystemC ssc;
public Facade() {
this.ssa = new SubSystemA();
this.ssb = new SubSystemB();
this.ssc = new SubSystemC();
}
public void method() {
ssa.methodA();
ssb.methodB();
ssc.methodC();
}
}
FacadeTest.java
public class FacadeTest {
public static void main(String[] args) {
Facade facade = new Facade();
facade.method();
}
}
应用场景
对分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系。
当一个复杂系统的子系统很多时,外观模式可以为系统设计一个简单的接口供外界访问。
当客户端与多个子系统之间存在很大的联系时,引入外观模式可将它们分离,从而提高子系统的独立性和可移植性。
猜你喜欢
- 2025-07-28 六种java的多线程设计模式详解和代码举例
- 2025-07-28 Java设计模式(java设计模式刘伟课后答案)
- 2025-07-28 Java设计模式之组合模式(组合 java)
- 2025-07-28 Java设计模式之装饰模式(java装饰模式和代理模式)
- 2025-07-28 Java设计模式之模板方法模式(java怎么写模板类)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)