设计模式之门面模式

2023-07-12  本文已影响0人  Tinyspot

1. 门面模式(Facade)

Facade Pattern

1.2 组成部分

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();
    }
}
上一篇 下一篇

猜你喜欢

热点阅读