生活实例
图例中的"装机公司"就是一种"外观模式",我们不需要与众多的硬打交道,只需要与装机公司联系,就可以组装电脑了
外观模式定义
为系统中的一组接口提供一个一直的界面,Facade模式定义了一个高层接口,这个接口使得子系统更加容易使用.
- 组件界面--从一个组件的外部来观看这个组件,能看到的界面,比如:一个类的public方法就是这个类的界面,一个模块外部看这个模块,模块的接口就是这个模块的界面.
- 接口--模块的外部与模块之间交互的一个通道,通常是类的方法或接口方
- Facade--定义子系统的多个模块对外的高层接口,通常需要调用内部多个模块,从而把客户的请求代理给适当的子系统对象
- 模块--接受Facade对象的委派,真正实现功能,各个模块之间可能有交互,但注意,Facade对象知道各个模块,但是各个模块不应该知道Facade对象.
实例代码
/*
A模块接口
*/
public interface AModuleApi {
public void testA();
}
/*
A模块实现类
*/
public class AModuleImpl implements AModuleApi {
public void testA() {
sysout("正在A模块,操作A方法");
}
}
/*
B模块接口
*/
public interface BModuleApi {
public void testB();
}
/*
B模块实现类
*/
public class BModuleImpl implements BModuleApi {
public void testB() {
sysout("正在B模块,操作B方法");
}
}
/*
C模块接口
*/
public interface CModuleApi {
public void testC();
}
/*
C模块实现类
*/
public class CModuleImpl implements CModuleApi {
public void testC() {
sysout("正在C模块,操作C方法");
}
}
/*
定义外观类
*/
public class Facade {
public void test() {
AModuleApi a = new AmoduleImpl();
a.testA();
BModuleApi b = new BmoduleImpl();
b.testB();
CModuleApi a = new CmoduleImpl();
c.testC();
}
}
/*
客户端代码
*/
public class client {
public static void main(String[] args) {
new Facade().test();
}
}
认识外观模式
- 外观模式的目的
- 有何变化
- 可以选择性的使用外观
外观模式调用示意图
外观模式的实现
- 单例模式
public class Facade {
private Facade(){
}
public static void test() {
AModuleApi a = new AmoduleImpl();
BModuleApi b = new BmoduleImpl();a.testA();
b.testB();
CModuleApi a = new CmoduleImpl();c.testC();
}
}
外观模式的本质
封装交互,简单调用
何时选用外观模式
- 如果希望为一个复杂的子系统提供一个简单接口的时候,可以考虑使用外观模式,使用外观对象来实现大部分客户端需要的功能,从而简化客户端的使用.
- 如果想要让客户端程序和抽象的实现部分松散耦合,可以考虑使用外观模式,使用外观对象将这个子系统与它的客户分离开,从而提高子系统的独立性和可移植性.
- 如果构建多层的系统,可以考虑使用外观模式,使用外观对象作为每层的入口,这样可以简化层见调用,也可以松散层次之间的依赖关系.
public interface AMoudleInterface {
public void testA();
}
------------------------------------------------------------------
public class AMoudleImpl implements AMoudleInterface {
@Override
public void testA() {
System.err.println("正在操作A接口的A方法");
}
}
------------------------------------------------------------------
public interface BMoudleInterface {
public void testB();
}
------------------------------------------------------------------
public class BMoudleImpl implements BMoudleInterface {
@Override
public void testB() {
System.err.println("正在操作B接口的B方法");
}
}
------------------------------------------------------------------
//外观类,对多次操作进行封装
public class FacadeModule {
public void test() {
AMoudleImpl aMoudleImpl = new AMoudleImpl();
aMoudleImpl.testA();
BMoudleImpl bMoudleImpl = new BMoudleImpl();
bMoudleImpl.testB();
}
}
------------------------------------------------------------------
public class Client {
public static void main(String[] args) {
//外观模式封装了对一组接口的操作细节
//原始调用方法
AMoudleImpl aMoudleImpl = new AMoudleImpl();
aMoudleImpl.testA();
BMoudleImpl bMoudleImpl = new BMoudleImpl();
bMoudleImpl.testB();
System.err.println("====================================");
//外观模式后
//可以使用外观模式组合调用,也可以根据需要单独调用
FacadeModule facadeModule = new FacadeModule();
facadeModule.test();
}
}