使用场景
- 在开发过程中,我们经常需要对一个应用分成不同的层次,例如经典的三层架构,就需要考虑数据访问层和逻辑处理层,逻辑处理层和表示层的层与层之间建立外观
Facade
,这样可以给复杂的子系统提供一个方便操作的简单的接口,使得耦合程度大大降低。 - 其次在开发过程中,子系统往往因为过多的重构而变得越来越复杂,大多数的模式使用时也会产生很多很小的类,这本是好事,但是却增加了外部调用的复杂度,这是增加一个Facade类,就能很好的解决这种情况。
- 在维护一个遗留的大型系统的时候,可能这个系统已经过时并且非常难以维护和扩展了,但是因为包含了很多非常重要的功能,新的需求开发必须依赖它,此时使用外观模式也是非常适合的,给新系统提供一个外观Facade类,来提供设计粗糙的旧系统比较清晰的简单的交互接口,让新系统与facade对象交互,Facade与遗留代码交互所有复杂的工作。
用例图
代码实现
package com.liran.main.DesignPattern.外观模式;
/**
* 外观模式
* 为子系统中的一组接口提供一个统一的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
* Created by LiRan on 2016-02-17.
*/
public class Facade_Pattern {
public static void main(String[] args) {
Client client = new Client(new Facade());
client.doSomeThing();
}
}
/**
* 客户端
*/
class Client {
private Facade facade;
public Client(Facade facade) {
this.facade = facade;
}
public void doSomeThing() {
facade.MethodA();
facade.MethodB();
}
}
/**
* 外观类
*/
class Facade {
private SubSystemOne systemOne;
private SubSystemTwo systemTwo;
private SubSystemThree systemThree;
private SubSystemFour systemFour;
public Facade() {
systemOne = new SubSystemOne();
systemTwo = new SubSystemTwo();
systemThree = new SubSystemThree();
systemFour = new SubSystemFour();
}
public void MethodA() {
System.out.println("方法组A---------");
systemOne.MethodOne();
systemThree.MethodThree();
}
public void MethodB() {
System.out.println("方法组B-----------");
systemTwo.MethodTwo();
systemFour.MethodFour();
}
}
/**
* 子系统类
*/
class SubSystemOne {
public void MethodOne() {
System.out.println("子系统方法一");
}
}
/**
* 子系统类
*/
class SubSystemTwo {
public void MethodTwo() {
System.out.println("子系统方法二");
}
}
/**
* 子系统类
*/
class SubSystemThree {
public void MethodThree() {
System.out.println("子系统方法三");
}
}
/**
* 子系统类
*/
class SubSystemFour {
public void MethodFour() {
System.out.println("子系统方法四");
}
}
源码下载:Github
有问题欢迎在评论中提问。