目录
一. 概念介绍
外观模式(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();
}
}
第四步:测试类编写
package test;
/**
* 测试类
* @author ningbeibei
*
*/
public class test1 {
//测试方法
public static void main(String[] args) {
/**客户端在调用这个三个系统时只需要通过Facade
* 这个接口就可以访问各个系统得方法*/
Facade fac = new FacadeImpl();
fac.methodA();
fac.methodB();
fac.methodC();
}
}
运行结果
三. 优点
松散耦合:
使得客户端和子系统之间解耦,让子系统内部的模块功能更容易扩展和维护。
简单易用:
客户端根本不需要知道子系统内部的实现,或者根本不需要知道子系统内部的构成,它只需要跟Facade类交互即可。
更好的划分访问层次:
有些方法是对系统外的,有些方法是系统内部相互交互的使用的。子系统把那些暴露给外部的功能集中到门面中,这样就可以实现客户端的使用,很好的隐藏了子系统内部的细节。