外观模式(Facade Pattern)
为子系统中一系列接口提供一个统一的界面,从而使得子系统更加容易使用。
在GoF23种设计模式中,属于结构型模式( Structural patterns)
。
外观模式,或叫门面模式。应该是我们最常使用的模式。
在controller-service-dao后端三层模型中,可以说几乎每一个service逻辑都是一个外观模式的实现。
- 优点
- 符合迪米特原则
- 减少系统依赖性
- 缺点
- 不符合开闭原则
- 使用场景
- 对复杂逻辑进行封装,提供简易api
- “画地为牢”,预防低水平人员带来的风险扩散
实现
uml类图
我们可以清楚的看到客户端仅依赖于facade,而跟其余的三个子系统没有交集。
用facade作为封装,简化了子系统的使用,降低了client的复杂性。
code
把学校当做一个系统,该系统中有食堂、图书馆、宿舍三个子系统。
通过外观模式创建该系统时,我们可以把学校当做外观类,学生仅通过访问学校即可享受其他的子系统。
类图如下。
- School.java
public class School {
private Library library = new Library();
private Canteen canteen = new Canteen();
private Dormitory dormitory = new Dormitory();
public void inSchool(String name) {
//学习
library.learn(name);
//吃饭
canteen.eat(name);
//休息
dormitory.relax(name);
System.out.println(name + "的完美校园生活...");
}
}
- Library.java
public class Library {
public void learn(String name) {
System.out.println(name + "在图书馆学习...");
}
}
- Dormitory.java
public class Dormitory {
public void relax(String name) {
System.out.println(name + "在宿舍休息...");
}
}
- Canteen.java
public class Canteen {
public void eat(String name) {
System.out.println(name + "在食堂吃饭...");
}
}
- Test.java
public class Test {
public static void main(String[] args) {
School school = new School();
school.inSchool("张三");
}
}
- output
张三在图书馆学习...
张三在食堂吃饭...
张三在宿舍休息...
张三的完美校园生活...
总结
外观模式可以很好的实现高内聚低耦合,缺点是违反了开闭原则,拓展性不强。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名,转载请标明出处
最后编辑时间为:
2019-11-13