基本介绍
- 也叫过程模式:外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用
- 外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节
3.类图如下:
1)外观类(Facade):为调用端提供统一的调用接口,外观类知道哪些子系统负责处理请求,从而将调用端的请求代理给适当子系统对象
2)调用者(Client):外观接口的调用者
3)子系统的集合:指模块或者子系统,处理Facade对象指派的任务,他是功能的实际提供者
4.解决的问题:降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口,至此客户端不与系统耦合,外观类与系统耦合
代码示例
https://gitee.com/ldj123/design-patterns.git
注意事项
1)外观模式对外屏蔽了子系统的细节,因此外观模式降低了客户端对子系统使用的复杂性
2)外观模式对客户端与子系统的耦合关系,让子系统内部的模块更易维护和扩展
3)通过合理的使用外观模式,可以帮我们更好的划分访问的层次
4)当系统需要进行分层设计时,可以考虑使用Facade模式
5)不能过多的或者不合理的使用外观模式,使用外观模式好,还是直接调用模块好。
源码中应用
MyBatis 中的Configuration 去创建MetaObject 对象使用到外观模式,部分代码示例如下:
public class Configuration {
protected ReflectorFactory reflectorFactory =
new DefaultReflectorFactory();
protected ObjectFactory objectFactory =
new DefaultObjectFactory();
protected ObjectWrapperFactory objectWrapperFactory =
new DefaultObjectWrapperFactory();
public MetaObject newMetaObject(Object object) {
return MetaObject.forObject
(object, objectFactory, objectWrapperFactory, reflectorFactory);
}
}
public class MetaObject{
private MetaObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) {
this.originalObject = object;
this.objectFactory = objectFactory;
this.objectWrapperFactory = objectWrapperFactory;
this.reflectorFactory = reflectorFactory;
if (object instanceof ObjectWrapper) {
this.objectWrapper = (ObjectWrapper) object;
} else if (objectWrapperFactory.hasWrapperFor(object)) {
this.objectWrapper = objectWrapperFactory.getWrapperFor(this, object);
} else if (object instanceof Map) {
this.objectWrapper = new MapWrapper(this, (Map) object);
} else if (object instanceof Collection) {
this.objectWrapper = new CollectionWrapper(this, (Collection) object);
} else {
this.objectWrapper = new BeanWrapper(this, object);
}}
public static MetaObject forObject(Object object, ObjectFactory,objectFactoryObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) {}
类图如下: