美文网首页
设计模式之门面模式

设计模式之门面模式

作者: Tinyspot | 来源:发表于2023-07-12 11:45 被阅读0次

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();
    }
}

相关文章

  • 设计模式之——门面模式

    门面模式 门面模式(Facade Pattern)又叫外观模式,提供了一个统一的接口,用来访问子系统中的一群接口。...

  • 设计模式之——门面模式

    1 门面模式的定义 门面模式:Facade Pattern,也叫做外观模式。要求一个子系统的外部与其内部的通信必须...

  • 设计模式系列之「门面模式」

    《三国演义》中有曰:刘备、诸葛亮趁曹操赤壁之战失利,大肆扩充地盘,先后占领荆州大部地区,引起东吴孙权的警惕。为了限...

  • 设计模式之禅-门面模式

    1.业务背景 我们把写信分为四步: 一、写正文 二、写信封 三、把信封起来 四、邮寄 写一封信还好,但如果写100...

  • 设计模式-门面模式

    一:门面模式的定义 外观模式的目的不是给予子系统添加新的功能接口,而是为了让外部减少与子系统内多个模块的交互,松散...

  • 设计模式—门面模式

    门面(Facade)模式的定义:是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式...

  • 外观模式(Facede)

    本文参考自: 《JAVA设计模式》之外观模式(Facade) 1. 作用 外观模式也叫门面模式,门面模式是对象的结...

  • OkHttp的使用之设计模式

    使用的设计模式有: 创建者模式 策略模式 门面模式 责任链模式

  • 门面模式设计

    门面模式 两个作用: 1、简化类的接口 2、消除类与使用它的客户代码之间的耦合 门面模式常常是开发人员最亲密的朋友...

  • 设计模式——门面模式(外观模式)

    《Head First 设计模式》《设计模式之禅(第二版)》 学习笔记,码云同步更新中如有错误或不足之处,请一定指...

网友评论

      本文标题:设计模式之门面模式

      本文链接:https://www.haomeiwen.com/subject/dccpudtx.html