程序员设计模式简讲

22. 外观模式

2018-07-09  本文已影响27人  Next_吴思成

定义

外观模式(Facade Pattern):为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

通俗理解

《人类简历》里面有一个观点:现在的人类并没有远古时期的人类聪明。他给出了他的证据,在那一个茹毛饮血的时代里面,每个人都要学会很多的生存技能。他们要学会判断天气的变化、学会规避野兽的袭击、需要知道哪些野果能吃、哪些不能吃、需要知道地上哪里有坑、有埋伏... ... 只有这样,他们才能够生存下来,不然小命就不保了。

反观现代的人类,吃饭有外卖、穿的衣服可以买、出门看天气预报不看天、野兽都在动物园里面... ...社会形成了一个高度细化的分工,远古时期人类掌握的每一个技能,放到现在都有相应的专业人士去做,而且做得更好。这是一种进步,明确分工提高了整个社会的效率,使得人类成为地球的生物之王。

外观模式就是这一次人类变蠢的过程。当一件事情很复杂的时候,我们会让专业的人士去弄好,然后我们直接用就可以了。例如我们在下馆子的时候,都是直接点菜,然后厨子做菜,我们吃菜就完了。而不是我们点了菜,去市场,挑选菜品,回到餐厅,洗菜、切菜、下油、下盐、下菜、炒菜、装盘,然后才吃菜。厨子做菜的过程就是符合外观模式的过程。

示例

业务按照厨子做菜来定义。

渣渣程序

市场类和厨房类

public class Market {
    public void selectFood() {
        System.out.println("挑选食物");
    }
}
public class Kitchen {
    public void washFood() {
        System.out.println("洗菜");
    }
    public void cutFood() {
        System.out.println("切菜");
    }
    public void fryFood() {
        System.out.println("炒菜");
    }
    public void stageFood() {
        System.out.println("装菜");
    }
}

程序入口

public class Main {
    public static void main(String[] args) {
        Market market = new Market();
        Kitchen kitchen = new Kitchen();

        market.selectFood();
        kitchen.cutFood();
        kitchen.washFood();
        kitchen.fryFood();
        kitchen.stageFood();
    }
}
//挑选食物
//切菜
//洗菜
//炒菜
//装菜

上面程序存在如下问题:

  1. 调用方需要知道每一个方法及其方法的含义;
  2. 如果子系统(市场,厨房算是子系统)的方法有变动,那么会牵连到调用方;
  3. 子系统的接口复杂,使用繁琐;
  4. 违反迪米特法则。

优化

所有的优化,都可以通过在原来的系统上封装一层去优化,那我们只需要在市场和厨房上面封装一层餐馆,就可以解决问题了。

类图

程序

餐馆类

public class Restaurant {
    Market market = new Market();
    Kitchen kitchen = new Kitchen();
    public void orderFood() {
        market.selectFood();
        kitchen.washFood();
        kitchen.cutFood();
        kitchen.fryFood();
        kitchen.stageFood();
    }
}

程序主入口

public class Main {
    public static void main(String[] args) {
        Restaurant restaurant = new Restaurant();
        restaurant.orderFood();
    }
}

优点

  1. 减少外部系统对子系统的依赖,使调用方的代码更简单;
  2. 实现子系统和调用方的松耦合,子系统的改变不会影响到调用方,子需要修改外观类就可以了;
  3. 子系统的修改不影响其他子系统和外观类。

缺点

  1. 减少了调用方对子系统的依赖,缺少了灵活性(切菜只能切成丁的);
  2. 设计不当,添加新的子系统的时候,需要修改外观类,违反了开闭原则。

应用场景

  1. 为一个复杂系统提供一个简单接口,就是在子系统上面封一层。

实例

JDK Collections工具类,封装了排序、查找之类的方法,使用就是外观模式。

程序

e22_facade_pattern|给我star

https://www.jianshu.com/p/1fa304ac5af9

上一篇 下一篇

猜你喜欢

热点阅读