设计模式之外观模式

  外观模式,属于结构型设计模式,它向现有的系统提供了一个接口来隐藏系统的复杂性,符合迪米特法则,目的是降低耦合。

  定义:为子系统的一组接口提供一个统一的入口,定义一个高层接口,这个接口是的这个子系统更加容易使用。

  问题描述:在开发过程中,一个对象与另一个复杂对象的子对象之间产生耦合,导致了这个对象会随着子对象的变化而变化,后期修改的难度会增加。

  解决方案:将复杂对象的子对象和其它对象之间的依赖进行解耦,简化它们之间的交互接口。

  结构图

  

  举个栗子:讲一个画画的故事。。。

  我们现在有三支笔(Pen),毛笔(Brush)写字、铅笔(Pencil)素描和画笔(Paint)绘图,它们拥有一个共同的功能---draw(),现在我们要在代码的世界里来描述这样的功能。一般的实现方式如下:

  1. 新建一个共有的接口Pen,定义一个绘制方法draw(),具体让子类去实现。代码如下:

          

  2. 分别新建毛笔类Brush、铅笔类Pencil和画笔类Paint,均实现接口Pen中的方法。代码如下:

          

          

          

  3. 在类FacadeFragment中分别使用三个对象实例来实现相应的绘制功能。代码如下:

          

  以上我们可以看出,我们需要三个对象才能实现出描述笔的功能,并且使用者与笔类存在很大的依赖性,类与类之间产生了一定的耦合。那么我们如何去降低这些耦合呢?使用外观模式,增加一个外观类作为中间者并提供一个简单的入口,将绘制功能独立出来。

  4. 新建一个外观类PenFacade,持有三种接口Pen对象的引用,并对外公开绘制方法。代码如下:

         

  5. 在类FacadeFragment中使用外观类PenFacade的对象实例来实现相应的绘制功能。代码如下: 

         

  以上,使用外观模式,就将子系统(笔类)独立出来了,它虽然不给系统增加任何新的功能,仅仅是简化了使用者类和子系统之间的调用关系,使得使用者类中减少了处理的对象数目,提高了子系统的移植性,是子系统的使用更加容易些。

  优点

  1. 减少类与类之间的相互依赖,降低了耦合;

  2. 减少了使用者类中所需处理对象的数目,使得子系统的使用更加容易。

  缺点:违反了开闭原则。

  适用场景

  1. 需要为一个复杂的子系统提供一个简单的入口时;

  2. 使用者类与多个子系统之间存在很大的依赖性时;

  3. 需要降低层与层之间的耦合度时。

原文地址:https://www.cnblogs.com/chenxkang/p/6762713.html