1. 门面模式(Facade)
Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higher-level interface that makes the subsystem easier to use.
- 外观模式又称门面模式、包装模式,基本原理是将复杂的内部实现以统一接口的方式暴露出来,最大程度地减少客户程序对某些子系统内部众多对象的依赖关系
- 外观模式的作用是将复杂“子系统”内部的各种外部调用通过一个集中外观对象包装并暴露出来
Facade Pattern
1.2 组成部分
- Facade 接口
- 由子系统提供一个高层次的、简单的接口
- 类比生活中的接待员
- Subsystem 子系统
2. 示例
@Test
public void test() {
OrderFacade facade = new OrderFacade();
facade.addOrder();
}
public class OrderFacade {
// 被委托的对象
private PaymentService paymentService = new PaymentService();
private GiftService giftService = new GiftService();
// 对外提供的方法
public double addOrder() {
paymentService.doSomething();
giftService.doSomething();
// 返回下单后应付的金额
return 100.00;
}
}
public class PaymentService {
public void doSomething() {
System.out.println("PaymentService...");
}
}
public class GiftService {
public void doSomething() {
System.out.println("GiftService...");
}
}
3. 应用场景
3.1 JDK的门面类Class
JVM-Class
public final class Class<T> implements java.io.Serializable, GenericDeclaration, Type, AnnotatedElement {
// 获取目标类所声明的方法
@CallerSensitive
public Class<?>[] getDeclaredClasses() throws SecurityException {
checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), false);
return getDeclaredClasses0();
}
@CallerSensitive
public Field[] getDeclaredFields() throws SecurityException {
checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true);
return copyFields(privateGetDeclaredFields(false));
}
}
3.2 MyBatis的门面类Configuration
Configuration.java
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 ParameterHandler newParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) {
ParameterHandler parameterHandler = mappedStatement.getLang().createParameterHandler(mappedStatement, parameterObject, boundSql);
parameterHandler = (ParameterHandler) interceptorChain.pluginAll(parameterHandler);
return parameterHandler;
}
public ResultSetHandler newResultSetHandler(Executor executor, MappedStatement mappedStatement, RowBounds rowBounds, ParameterHandler parameterHandler,
ResultHandler resultHandler, BoundSql boundSql) {
ResultSetHandler resultSetHandler = new DefaultResultSetHandler(executor, mappedStatement, parameterHandler, resultHandler, boundSql, rowBounds);
resultSetHandler = (ResultSetHandler) interceptorChain.pluginAll(resultSetHandler);
return resultSetHandler;
}
public StatementHandler newStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
StatementHandler statementHandler = new RoutingStatementHandler(executor, mappedStatement, parameterObject, rowBounds, resultHandler, boundSql);
statementHandler = (StatementHandler) interceptorChain.pluginAll(statementHandler);
return statementHandler;
}
}
3.3 Tomcat的门面类RequestFacade
public class RequestFacade implements HttpServletRequest {
@Override
public String getContentType() {
if (request == null) {
throw new IllegalStateException(sm.getString("requestFacade.nullRequest"));
}
return request.getContentType();
}
@Override
public String getParameter(String name) {
if (request == null) {
throw new IllegalStateException(sm.getString("requestFacade.nullRequest"));
}
if (Globals.IS_SECURITY_ENABLED){
return AccessController.doPrivileged(
new GetParameterPrivilegedAction(name));
} else {
return request.getParameter(name);
}
}
@Override
public ServletInputStream getInputStream() throws IOException {
if (request == null) {
throw new IllegalStateException(sm.getString("requestFacade.nullRequest"));
}
return request.getInputStream();
}
}
网友评论