结构型模式的目的是通过组合类或对象产生更大结构,以适应更高层次的逻辑需求;
结构型模式共有7种:
■ 代理模式
■ 装饰模式
■ 适配器模式
■ 组合模式
■ 桥梁模式
■ 外观模式
■ 享元模式
一、外观模式的简介
要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行;

image.png

image.png
外观模式两个角色:
■ 外观(Facade)角色:客户端可以调用该角色的方法,该角色知晓相关子系统的功能和责任;
■ 子系统(Subsystem)角色:可以同时有一个或多个子系统,每一个子系统都不是一个单独的类,而是一个类的集合;
二、外观模式的优缺点
外观模式最大的优点:
■ 减少系统的相互依赖,所有的依赖都是对Façade对象的依赖,与子系统无关;
■ 提高灵活性,不管子系统内部如何变化,只要不影响Facade对象,任何活动都是自由的;
■ 提高安全性,Facade中未提供的方法,外界就无法访问,提高系统的安全性;
外观模式最大的缺点:
■ 不符合开闭原则,对修改关闭,对扩展开放
三、外观模式的场景
■ 为一个复杂的模块或子系统提供一个供外界访问的接口;
■ 子系统相对独立,外界对子系统的访问只要黑箱操作即可;
■ 预防风险扩散,使用Façade进行访问操作控制;
四、外观模式的实例
使用外观模式模拟秘书为老板准备工作的过程;

image.png
/**
* 机场类
*/
public class Airport {
/**
* 订购机票
* @param from
* @param to
*/
public void bookTicket(String from , String to){
System.out.println("订购了从" + from + "到" + to + "机票");
}
}
/**
* 酒店类
*/
public class Restaurant {
/**
* 订酒桌
* @param num
*/
public void reserve(int num){
System.out.println("订了一桌" + num + "个人的酒席");
}
}
/**
* 宾馆类
*/
public class Hotel {
/**
* 订房间
* @param days
*/
public void reserve(int days){
System.out.println("订了" + days + "天的房间");
}
}
/**
* 司机类
*/
public class Chauffeur {
/**
* 开车去哪
* @param to
*/
public void drive(String to){
System.out.println("司机开车去" + to);
}
}
/**
* 秘书类
*/
public class Secretary {
/**
* 司机
*/
private Chauffeur chauffeur = new Chauffeur();
/**
* 宾馆
*/
private Hotel hotel = new Hotel();
/**
* 机场
*/
private Airport airport = new Airport();
/**
* 酒店
*/
private Restaurant restaurant = new Restaurant();
/**
* 安排出差
* @param to 去哪
* @param days 几天
*/
public void trip(String to , int days){
// 1 买机票
airport.bookTicket("北京" , to);
// 2 安排司机送
chauffeur.drive("机场");
// 3 订宾馆
hotel.reserve(days);
}
/**
* 安排饭局
* @param num 几人
*/
public void repast(int num){
// 1 订酒店
restaurant.reserve(num);
// 2 安排司机送
chauffeur.drive("酒店");
}
}
/**
* 老板类
*/
public class Boss {
public static void main(String[] args){
// new 个秘书
Secretary secretary = new Secretary();
System.out.println("**********************************");
System.out.println("老板告诉秘书要去上海出差10天");
secretary.trip("上海" , 10);
System.out.println("**********************************");
System.out.println("老板告诉秘书要请8个人吃饭");
secretary.repast(8);
System.out.println("**********************************");
}
}
# 控制台输出:
**********************************
老板告诉秘书要去上海出差10天
订购了从北京到上海机票
司机开车去机场
订了10天的房间
**********************************
老板告诉秘书要请8个人吃饭
订了一桌8个人的酒席
司机开车去酒店
**********************************
参考:
摘录 《设计模式(Java版)》韩敬海主编;(微信读书APP中有资源,可以直接阅读)
网友评论