基本介绍
外观模式也叫做“过程模式”,该模式的核心思想是为不同子系统(类)中的一组接口提供一个一致的界面(类)。也就是定义一个高层次的类,该类封装了一些低层次的类和其方法,客户端使用时就用该类。
通过外观模式可以屏蔽子系统中的细节,促使调用端只需要跟高层次的类发生关系即可,无需再关注子系统的内部实现细节。
外观模式还从一定程度上简化了用户的操作,降低了使用的复杂度。
外观模式UML类图
角色以及职责讲解:
1、FacadeClass(外观类):给客户端提供统一的接口,外观类知道当前的请求由哪些子系统负责。从而可以做到将客户端的请求代理给适当的子系统进行处理。
2、Subsystem1-4(子系统):功能的实际提供者,用于处理外观类指派来的任务。
3、Client(客户端):外观类的调用者。
案例讲解
通过以上的类图和描述大家是否对外观模式有了一定的认识?下面让我们通过一个小案例来体会一下外观模式的魅力。
案例:到吃饭的时间了小菜鸟想吃西红柿鸡蛋面,现在有两个选择,可以选择自己买好原材料,自己做饭,也可以选择下馆子(饭店)。作为一个聪明的菜鸟,我当然是选择下馆子嘛,有现成的为什么要自己造轮子那?这里的饭店就相当外观类,下面让我们用代码实现以下。
子系统相关类
/**
* 采购员 => 对应子系统角色
*/
public class Buyer {
// 使用单例模式(懒汉式)
private final static Buyer INSTANCE = new Buyer();
public static Buyer getInstance(){
return INSTANCE;
}
private Buyer() {
}
protected void egg() {
System.out.println("采购员:买了两个鸡蛋!");
}
protected void tomatoes() {
System.out.println("采购员:买了一个西红柿!");
}
protected void noodle() {
System.out.println("采购员:买了一斤面条!");
}
}
/**
* 厨师 => 对应子系统角色
*/
public class Chef {
// 使用单例模式(懒汉式)
private final static Chef INSTANCE = new Chef();
public static Chef getInstance() {
return INSTANCE;
}
private Chef() {
}
public void cook() {
System.out.println("厨师:制作好西红柿鸡蛋面!");
}
}
/**
* 服务员 => 对应子系统角色
*/
public class Waiter {
// 使用单例模式(懒汉式)
private final static Waiter INSTANCE = new Waiter();
public static Waiter getInstance() {
return INSTANCE;
}
private Waiter() {
}
public void deliver() {
System.out.println("服务员:端上了菜!");
}
}
外观类
/**
* 餐厅 => 对应外观类角色
*/
public class RestaurantFacade {
// 定义子系统对象
private Buyer buyer;
private Chef chef;
private Waiter waiter;
// 构造方法
public RestaurantFacade() {
this.buyer = Buyer.getInstance();
this.chef = Chef.getInstance();
this.waiter = Waiter.getInstance();
}
// 顾客点面条
public void orderNoodles() {
this.buyer.egg();
this.buyer.tomatoes();
this.buyer.noodle();
this.chef.cook();
this.waiter.deliver();
}
}
客户端测试类
public class Client {
public static void main(String[] args) {
RestaurantFacade restaurantFacade = new RestaurantFacade();
restaurantFacade.orderNoodles();
}
}
测试结果
总结
1、外观模式对外屏蔽了子系统的实现细节,从而降低了客户端对子系统使用的复杂度。
2、使用外观模式可以降低客户端与子系统的耦合性,使得子系统内部更容易维护和扩展。
3、当系统需要分层设计时,可以使用外观模式,并且通过合理的使用外观模式,可以帮我们更好的划分系统的访问层次。
4、不能过多的或者不合理的使用外观模式。具体是使用外观模式好,还是直接调用模块好,要以让系统有层次,利于维护为目的。
今天的分享就到这里了,如果感觉“菜鸟”写的文章还不错,记得点赞加关注呦!你们的支持就是我坚持下去的动力。文章哪里写的有问题的也希望大家可以指出,我会虚心受教。