一,概念介绍
外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。这种类型的设计模式属于结构性模式。为子系统中的一组接口提供了一个统一的访问接口,这个接口使得子系统更容易被访问或者使用。
二,代码实现
直接上代码吧,边看代码遍理解概念,我觉得这样效果也不错,
第一步:先定义系统A、系统B、系统C这三个类,
复制代码
package test;
/**
- A系统
- @author ningbeibei
*/
public class SystemA {
//A系统方法
public void functionA() {
System.out.println(“我是系统A…”);
}
}
复制代码
复制代码
package test;
/**
- B系统
- @author ningbeibei
*/
public class SystemB {
//B系统方法
public void functionB() {
System.out.println(“我是系统B…”);
}
复制代码
复制代码
package test;
/**
- C系统
- @author ningbeibei
*/
public class SystemC {
//C系统方法
public void functionC() {
System.out.println(“我是系统C…”);
}
}
复制代码
第二步:定义一个高层接口,分别声明调用三个子系统得方法
复制代码
package test;
/**
- 定义一个更高层得接口,使其实现类实现所有方法
- @author ningbeibei
*/
public interface Facade {
//方法A
void methodA();
//方法B
void methodB();
//方法C
void methodC();
}
复制代码
第三步:实现定义得高层接口,并且持有子系统对象引用
复制代码
package test;
/**
- 实现我们刚才定义得高层接口中得方法
- @author ningbeibei
*/
public class FacadeImpl implements Facade {
//这个系统需要实现类中持有他得引用。
private SystemA systema;
private SystemB systemb;
private SystemC systemc;
/**
* 重写实现类构造方法,初始化这个三个类得对象
*/
FacadeImpl(){
systema = new SystemA();
systemb = new SystemB();
systemc = new SystemC();
}
//调用A系统方法
@Override
public void methodA() {
systema.functionA();
}
//调用B系统方法
@Override
public void methodB() {
systemb.functionB();
}
//调用B系统方法
@Override
public void methodC() {
systemc.functionC();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
}
复制代码
第四步:测试类编写
复制代码
package test;
/**
- 测试类
- @author ningbeibei
*/
public class test1 {
//测试方法
public static void main(String[] args) {
/**客户端在调用这个三个系统时只需要通过Facade
* 这个接口就可以访问各个系统得方法*/
Facade fac = new FacadeImpl();
fac.methodA();
fac.methodB();
fac.methodC();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
}
复制代码
运行结果
三、优点
- 松散耦合
使得客户端和子系统之间解耦,让子系统内部的模块功能更容易扩展和维护;
- 简单易用
客户端根本不需要知道子系统内部的实现,或者根本不需要知道子系统内部的构成,它只需要跟Facade类交互即可。
- 更好的划分访问层次
有些方法是对系统外的,有些方法是系统内部相互交互的使用的。子系统把那些暴露给外部的功能集中到门面中,这样就可以实现客户端的使用,很好的隐藏了子系统内部的细节。