29 设计模式:外观模式-结构型模式

115 阅读5分钟

结构型模式之:

  • 适配器模式
  • 桥接模式
  • 组合模式
  • 装饰模式
  • 代理模式
  • 享元模式
  • 外观模式

1.什么是外观模式?

外观模式是一种结构型设计模式, 能为程序库、 框架或其他复杂类提供一个简单的接口。

假设我们有一个音响系统,由多个子系统组成:CDPlayer(CD播放器)、Amplifier(放大器)、Speakers(音箱)等。每个子系统都有自己的方法和功能。

现在,我们可以创建一个外观类 StereoSystemFacade 来封装这些子系统,并提供一个简单的接口供客户端使用。

// 子系统:CD播放器
class CDPlayer {
    public void on() {
        System.out.println("CD Player is on");
    }

    public void play(String cd) {
        System.out.println("Playing CD: " + cd);
    }
}

// 子系统:放大器
class Amplifier {
    public void on() {
        System.out.println("Amplifier is on");
    }

    public void setVolume(int volume) {
        System.out.println("Setting volume to " + volume);
    }
}

// 子系统:音箱
class Speakers {
    public void on() {
        System.out.println("Speakers are on");
    }

    public void playMusic() {
        System.out.println("Playing music");
    }
}

// 外观类:音响系统外观
class StereoSystemFacade {
    private CDPlayer cdPlayer;
    private Amplifier amplifier;
    private Speakers speakers;

    public StereoSystemFacade() {
        cdPlayer = new CDPlayer();
        amplifier = new Amplifier();
        speakers = new Speakers();
    }

    // 提供一个简单的方法给客户端使用
    public void playMusic(String cd, int volume) {
        cdPlayer.on();
        cdPlayer.play(cd);
        amplifier.on();
        amplifier.setVolume(volume);
        speakers.on();
        speakers.playMusic();
    }
}

// 客户端代码
public class FacadePatternExample {
    public static void main(String[] args) {
        // 创建音响系统外观
        StereoSystemFacade stereoSystem = new StereoSystemFacade();

        // 使用外观类的简单接口播放音乐
        stereoSystem.playMusic("Smooth Jazz", 10);
    }
}

在这个示例中,StereoSystemFacade 类是外观类,它封装了 CD 播放器、放大器和音箱等子系统,并提供了一个简单的 playMusic 方法给客户端使用。客户端只需要调用外观类的方法,而不需要了解子系统之间的复杂交互。

2.外观模式的实际使用?

  1. Android 开发中的 Android Support Library 和 AndroidX:这些库提供了许多实用工具和类,使得开发 Android 应用变得更加简单。例如,Android Support Library 中的 AppCompatActivity 类就是一个外观类,封装了许多与活动相关的复杂操作,使得开发者可以更轻松地创建活动。
  2. Spring 框架:Spring 框架是一个非常流行的 Java 开发框架,它提供了大量的功能和组件,用于开发企业级 Java 应用程序。Spring 的各个模块都提供了外观类来简化与底层系统的交互,例如,Spring MVC 模块中的 DispatcherServlet 类就是一个外观类,它封装了处理 HTTP 请求和响应的复杂逻辑。
  3. Hibernate ORM 框架:Hibernate 是一个用于 Java 应用程序的对象关系映射(ORM)框架,它简化了将 Java 对象与数据库表进行映射的过程。Hibernate 中的 SessionFactory 类就是一个外观类,封装了与数据库交互的底层细节,使得开发者可以更容易地进行数据库操作。
  4. Retrofit:Retrofit 是一个用于 Android 和 Java 应用程序的 RESTful Web 服务客户端库,它简化了通过 HTTP 请求与服务器进行通信的过程。Retrofit 提供了一个外观类 Retrofit,封装了创建和配置 HTTP 请求的复杂逻辑,使得开发者可以轻松地创建 RESTful Web 服务客户端。

3. 外观模式的使用场景

  1. 简化复杂系统的接口:当系统中存在许多复杂的子系统或组件,并且它们之间存在相互依赖关系时,外观模式可以为客户端提供一个统一的接口,简化与系统的交互。
  2. 隐藏系统的复杂性:外观模式将系统的复杂性封装在一个外观类中,客户端只需要与外观类交互,无需了解系统的内部细节。这样可以降低客户端的复杂度,并且提高系统的可维护性。
  3. 提供更高级别的接口:外观模式可以为客户端提供一个更高级别的接口,隐藏底层组件的细节实现,使得客户端更容易使用系统提供的功能。
  4. 遵循最少知识原则:外观模式有助于遵循最少知识原则,即客户端应该尽量减少与其他类的直接交互。通过使用外观模式,客户端只需与外观类进行交互,而不需要了解系统中的其他类。

4.外观模式的优缺点

优点:

  1. 简化接口:外观模式为客户端提供了一个简化的接口,隐藏了系统的复杂性,使得客户端更容易使用系统的功能。
  2. 降低耦合度:外观模式将系统的组件和客户端解耦,客户端只需要与外观类交互,而无需了解系统的内部实现细节。
  3. 提高可维护性:外观模式将系统的复杂性封装在一个外观类中,使得系统的变化对客户端的影响降到最低,提高了系统的可维护性和灵活性。
  4. 提高安全性:外观模式可以限制客户端对系统的访问,只提供必要的接口,从而提高系统的安全性。
  5. 提供更高级别的接口:外观模式可以为客户端提供一个更高级别的接口,隐藏底层组件的细节实现,使得客户端更容易理解和使用系统。

缺点:

  1. 不符合开闭原则:如果系统需要新增功能,可能需要修改外观类的实现,这会违反开闭原则,使得系统的扩展性变差。
  2. 可能引入性能问题:外观模式可能导致系统中出现过多的类和对象,可能会影响系统的性能。
  3. 可能隐藏系统的复杂性:虽然外观模式可以隐藏系统的复杂性,但有时候也可能会隐藏系统的真实问题,使得系统的设计和实现变得模糊和不清晰。