设计模式——外观模式

  外观模式的主要思想是将复杂的细粒度的对象服务包装成简单的易使用的粗粒度的功能服务,我们大家最容易理解和知道的外观模式就是,使用的API接口的封装,我们将第三方的API接口引入到我们的项目中的时候,我们需要对这些接口进行包装,将细粒度的具体调用过程进行包装成外观类的形式,通过外观类来进行统一的调用。

优点

  1、它对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。通过引入外观模式,客户端代码将变得很简单,与之关联的对象也很少。
  2、它实现了子系统与客户端之间的松耦合关系,这使得子系统的变化不会影响到调用它的客户端,只需要调整外观类即可。
  3、一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对象。

缺点

  1、不能很好地限制客户端直接使用子系统类,如果对客户端访问子系统类做太多的限制则减少了可变性和灵活 性。
  2、 如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则。

适用性

  1、为一个复杂子系统提供一个简单接口。
  2、提高子系统的独立性。
  3、在层次化结构中,可以使用Facade模式定义系统中每一层的入口。

实现要点

  1、Facade模式对客户屏蔽了子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。
  2、Facade模式实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。松耦合关系使得子系统的组件变化不会影响到它的客户。
  3、如果应用需要,它并不限制它们使用子系统类。因此你可以在系统易用性与通用性之间选择。

实现

  女娲造人的时候,在前面的例子中,我们只看到了,一个创建,人就出来了。其实人是很复杂的,每个器官,人体的每一部分都需要精细的制造。在这里把造人细化。类图如下:

人体部件的实现:

package com.lidaming.design07.facade;

public class Body {
    public void makeBody() {
        System.out.println("making body");
    }
    public void destroyBody()
    {
        System.out.println("destroy body");
    }
}
View Code
package com.lidaming.design07.facade;

public class Brain {
    public void makeBrain() {
        System.out.println("making brain");
    }
    public void destoryBrain()
    {
        System.out.println("destory body");
    }
}
View Code
package com.lidaming.design07.facade;

public class Heart {
    public void makeHeart() {
        System.out.println("making heart");
    }
    public void destoryHeart()
    {
        System.out.println("destory heart");
    }
}
View Code

外观类,人体的实现:

package com.lidaming.design07.facade;
/**
 * 外观类
 * @author admin
 *
 */
public class Human {
    Body body = new Body();
    Heart heart = new Heart();
    Brain brain = new Brain();
    
    public void make() {
        body.makeBody();
        brain.makeBrain();
        System.out.println("put brain into body");
        heart.makeHeart();
        System.out.println("put heart into body");
        System.out.println("finished a human");        
    }
    public void kill()
    {
        brain.destoryBrain();
        heart.destoryHeart();
        body.destroyBody();
    }
}
View Code

场景类:

package com.lidaming.design07.facade;

public class Client {
    public static void main(String[] args) {
        Human human = new Human();
        human.make();
        human.kill();
    }
}
View Code

分析

  外观模式最大的缺点在于违背了“开闭原则”,当增加新的子系统或者移除子系统时需要修改外观类,可以通过引入抽象外观类在一定程度上解决该问题,客户端针对抽象外观类进行编程。

总结

  Facade模式注重的是简化接口,它更多的时候是从架构的层次去看整个系统,而并非单个类的层次。

文章参考:

http://kb.cnblogs.com/page/84141/
http://blog.csdn.net/lovelion/article/details/8259789
http://www.cnblogs.com/dobetter/archive/2012/05/07/2488148.html

原文地址:https://www.cnblogs.com/hpuCode/p/5390150.html