定义:
外观模式也叫门面模式
要求一个子系统的外部与内部的通信必须通过一个统一的对象进行,外观模式提供一个高层次的接口,使得子系统更容易使用
角色:
- 外观角色:客户端可以调用该角色的方法,该角色知晓相关子系统的功能和责任,本角色会把所有客户端发来的请求委派到相应的子系统,该角色没有实际的业务逻辑,只是一个委托类
- 子系统角色:可以同时有多个子系统,每个子系统都不是一个单独的类,而是一个类的集合,子系统不知道外观角色的存在,外观角色相当于另外一个客户端
优点:
- 减少系统相互依赖,所有的依赖都是对外观角色的依赖,与子系统无关
- 提高灵活性,不管子系统内部如何变化,只要不影响外观角色对象,任何活动都是自由的
- 提高安全性,外观角色没有提供的方法,外界无法访问,提高系统的安全性
注意:
外观模式最大的缺点就是没有符合开闭原则
使用场景:
- 为一个复杂的模块或者子系统提供一个供外界访问的接口
- 子系统相互独立,外界对子系统的访问都只要黑箱操作即可
- 预防风险扩散,使用外观角色对象进行访问操作控制
实例:秘书为老板安排行程
package 外观模式;
public class Airport {
public void bookTicket(String from,String to){
System.out.println("订购一张从 "+from+" 到 "+to+" 的机票");
}
}
package 外观模式;
public class Restaurant {
public void reserve(int num) {
System.out.println("定一桌 "+num+" 个人的酒席");
}
}
package 外观模式;
public class Hotel {
public void reserve(int day) {
System.out.println("定 "+day+" 天的房间");
}
}
package 外观模式;
public class Chaueffeur {
public void driver(String to) {
System.out.println("司机开车去 "+to);
}
}
package 外观模式;
public class Secretary {
private Airport airport = new Airport();
private Restaurant restaurant = new Restaurant();
private Hotel hotel = new Hotel();
private Chaueffeur chaueffeur = new Chaueffeur();
public void trip(String from,String to,int day) {
airport.bookTicket(from, to);
chaueffeur.driver("机场");
hotel.reserve(day);
}
public void repest(int num) {
restaurant.reserve(num);
chaueffeur.driver("酒店");
}
}
package 外观模式;
public class Main {
public static void main(String []args) {
Secretary secretary = new Secretary();
System.out.println("安排出差");
secretary.trip("朔州", "北京", 7);
System.out.println("\n安排吃饭");
secretary.repest(10);
}
}
安排出差
订购一张从 朔州 到 北京 的机票
司机开车去 机场
定 7 天的房间安排吃饭
定一桌 10 个人的酒席
司机开车去 酒店