快速导航
一、外观模式简介
二、代码展示
三、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图:

从图中我们可以看出,外界客户端只和 BuyBookService 和 Book 有关联,至于BuyBookService 和其它Service的关联,是不对外暴露的。
运行结果也如预期所料:

三、jdk中使用的外观模式
1、JdbcUtils 中封装了 java.sql.Connection的 方法。

下面还有 closeStatement、
closeResultSet、getResultSetValue 方法都是类似的做法。
2、Mybatis 中的 Configuration 实例,也有外观模式。
newMetaObject、newParameterHandler、newResultSetHandler 都是封装了接口,对外提供服务。

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



714

被折叠的 条评论
为什么被折叠?



