第七章 外观模式(也叫 门面模式)

快速导航

一、外观模式简介

二、代码展示

三、jdk中使用的外观模式

一、外观模式简介

定义: 外观模式又叫门面模式,提供了一个统一的接口,用来访问子系统中一群接口。
外观模式定义了一个高层接口,让子系统更容易使用
类型: 结构型

适用场景:

1、子系统越来越复杂,增加外观模式提供简单接口调用
2、构建多层系统结构,利用外观对象作为每层的入口,简化层间调用

优点:
1、简化了调用过程,无需深入了解子系统,防止带来风险。
2、减少系统依赖、松散耦合
3、更好的划分访问层次
4、符合迪米特法则,即最少知道原则

缺点:
1、增加子系统、扩展子系统行为容易引入风险
2、增加子系统、扩展子系统 不符合开闭原则

相关设计模式:
1、外观模式和中介者模式
2、外观模式和单例模式
3、外观模式和抽象工厂模式

二、代码展示

代码展示的总体思路:
BuyBookService 是购买图书对外(客户端)提供的统一接口,外部不需要关注买书后具体什么业务逻辑,是BuyBookService 封装了 LogisticsService (物流服务)、IntegralService (积分服务)、OrderService (订单服务),这个就是门面模式。

/**
 * @program: adpn-pattern->BuyBook
 * @description: 外观模式--对外的暴露的接口
 * @author: Jstar
 * @create: 2019-11-24 17:36
 **/
public class BuyBookService {
    private LogisticsService logisticsService=new LogisticsService();
    private IntegralService integralService=new IntegralService();
    private OrderService orderService=new OrderService();

    public String buyBook(Book book){
        //省略业务逻辑
        String logistics = logisticsService.realLogistics(book);
        integralService.realIntegral(book);
        orderService.realOrder(book);
        System.out.println("购买成功,"+logistics);
        return "success";
    }
}
/**
 * @program: adpn-pattern->Book
 * @description: 实体书
 * @author: Jstar
 * @create: 2019-11-24 17:40
 **/
public class Book {
    private String name;
    private String address;

    public Book(String name, String address) {
        this.name = name;
        this.address = address;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
}
/**
 * @program: adpn-pattern->LogisticsService
 * @description: 物流服务
 * @author: Jstar
 * @create: 2019-11-24 17:38
 **/
public class LogisticsService {
    public String realLogistics(Book book){
        //这里省略业务逻辑
        System.out.println(book.getName()+" 物流信息校验成功");
        return "地址为:"+book.getAddress();
    }
}
/**
 * @program: adpn-pattern->IntegralService
 * @description: 积分服务
 * @author: Jstar
 * @create: 2019-11-24 17:38
 **/
public class IntegralService {
    public String realIntegral(Book book){
        //这里省略业务逻辑
        System.out.println(book.getName()+" 积分增加50分");
        return "integral success";
    }
}
/**
 * @program: adpn-pattern->OrderService
 * @description: 订单服务
 * @author: Jstar
 * @create: 2019-11-24 17:37
 **/
public class OrderService {
    public String realOrder(Book book){
        //这里省略业务逻辑
        System.out.println(book.getName()+" 下单成功");
        return "order success";
    }
}
/**
 * @program: adpn-pattern->BookTest
 * @description: 测试类
 * @author: Jstar
 * @create: 2019-11-24 17:50
 **/
public class BookTest {
    public static void main(String[] args) {
        Book book = new Book("平凡的世界", "北京市.海淀区");
        BuyBookService buyBookService = new BuyBookService();
        String flag = buyBookService.buyBook(book);
        System.out.println(flag);
    }
}

以上类中注释 description 都有说明类的作用,业务逻辑就省略了,只演示外观模式;BuyBookService 是对外暴露的接口。
来看一下,结构的UML图:

第七章 外观模式(也叫 门面模式)_第1张图片
从图中我们可以看出,外界客户端只和 BuyBookService 和 Book 有关联,至于BuyBookService 和其它Service的关联,是不对外暴露的。

运行结果也如预期所料:
第七章 外观模式(也叫 门面模式)_第2张图片

三、jdk中使用的外观模式

1、JdbcUtils 中封装了 java.sql.Connection的 方法。
第七章 外观模式(也叫 门面模式)_第3张图片
下面还有 closeStatement、
closeResultSet、getResultSetValue 方法都是类似的做法。

2、Mybatis 中的 Configuration 实例,也有外观模式。
newMetaObject、newParameterHandler、newResultSetHandler 都是封装了接口,对外提供服务。
第七章 外观模式(也叫 门面模式)_第4张图片

3、Tomcat 也用了很多外观模式,像一些带Facade的接口。(RequestFacade 是对 Request进行的封装、ResponseFacade 等)

第七章 外观模式(也叫 门面模式)_第5张图片
第七章 外观模式(也叫 门面模式)_第6张图片

你可能感兴趣的:(JAVA,设计模式,优雅的代码风格,Java,设计模式,外观模式)