外观模式(Facade Pattern)

49 阅读3分钟

攻略大全

1. 粘贴攻略

2. 造火箭攻略

3. 拧螺丝攻略

/**
 * @author Renzituo
 * time: 2022/11/15 23:24
 * desc: 子系统,提供独有功能
 */
public class DogSubSystem {

    public void play(){
        System.out.println("play");
    }
}
/**
 * @author Renzituo
 * time: 2022/11/15 23:24
 * desc: 子系统,提供独有功能
 */
public class CatSubSystem {

    public void sleep(){
        System.out.println("sleep");
    }
}
/**
 * @author Renzituo
 * time: 2022/11/15 23:23
 * desc: 外观类,调度子系统,向外界服务
 *      优点:降低了客户类与子系统类的耦合度,实现了子系统与客户之间的松耦合关系
 *          外观模式对客户屏蔽了子系统组件,从而简化了接口,减少了客户处理的对象数目并使子系统的使用更加简单
 *          降低原有系统的复杂度和系统中的编译依赖性,并简化了系统在不同平台之间的移植过程
 *
 *      缺点:在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”
 *          不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性
 *
 *      应用场景:要为一个复杂的子系统对外提供一个简单的接口
 *              提供子系统的独立性
 *              客户程序与多个子系统之间存在很大的依赖性
 *
 */
public class FaceSystem {


    /**
     * 通过外观系统,调用各个子系统的功能
     */


    CatSubSystem catSubSystem = new CatSubSystem();
    DogSubSystem dogSubSystem = new DogSubSystem();

    public void sleep(){
        catSubSystem.sleep();
    }

    public void play(){
        dogSubSystem.play();
    }
    
}

3.1 优点

  • 降低了客户类与子系统类的耦合度,实现了子系统与客户之间的松耦合关系
  1. 只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类
  2. 减少了与子系统的关联对象,实现了子系统与客户之间
    的松耦合关系,松耦合使得子系统的组件变化不会影响到它的客户。
  • 外观模式对客户屏蔽了子系统组件,从而简化了接口,减少了客户处理的对象数目并使子系统的使用更加简单。
  1. 引入外观角色之后,用户只需要与外观角色交互;
  2. 用户与子系统之间的复杂逻辑关系由外观角色来实现
  • 降低原有系统的复杂度和系统中的编译依赖性,并简化了系统在不同平台之间的移植过程

因为编译一个子系统一般不需要编译所有其他的子系统。一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对象。

3.2 缺点

  • 在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”
  • 不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性。

3.3 应用场景

  • 要为一个复杂的子系统对外提供一个简单的接口
  • 提供子系统的独立性
  • 客户程序与多个子系统之间存在很大的依赖性

引入外观类将子系统与客户以及其他子系统解耦,可以提高子系统的独立性和可移植性。

  • 在层次化结构中,可以使用外观模式定义系统中每一层的入口

层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度。

4. 复制攻略

4.1 Carson带你学设计模式:这是一份全面 & 详细的设计模式学习指南