结构型模式之:
- 适配器模式
- 桥接模式
- 组合模式
- 装饰模式
- 代理模式
- 享元模式
外观模式
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.外观模式的实际使用?
- Android 开发中的 Android Support Library 和 AndroidX:这些库提供了许多实用工具和类,使得开发 Android 应用变得更加简单。例如,Android Support Library 中的
AppCompatActivity类就是一个外观类,封装了许多与活动相关的复杂操作,使得开发者可以更轻松地创建活动。 - Spring 框架:Spring 框架是一个非常流行的 Java 开发框架,它提供了大量的功能和组件,用于开发企业级 Java 应用程序。Spring 的各个模块都提供了外观类来简化与底层系统的交互,例如,Spring MVC 模块中的
DispatcherServlet类就是一个外观类,它封装了处理 HTTP 请求和响应的复杂逻辑。 - Hibernate ORM 框架:Hibernate 是一个用于 Java 应用程序的对象关系映射(ORM)框架,它简化了将 Java 对象与数据库表进行映射的过程。Hibernate 中的
SessionFactory类就是一个外观类,封装了与数据库交互的底层细节,使得开发者可以更容易地进行数据库操作。 - Retrofit:Retrofit 是一个用于 Android 和 Java 应用程序的 RESTful Web 服务客户端库,它简化了通过 HTTP 请求与服务器进行通信的过程。Retrofit 提供了一个外观类
Retrofit,封装了创建和配置 HTTP 请求的复杂逻辑,使得开发者可以轻松地创建 RESTful Web 服务客户端。
3. 外观模式的使用场景
- 简化复杂系统的接口:当系统中存在许多复杂的子系统或组件,并且它们之间存在相互依赖关系时,外观模式可以为客户端提供一个统一的接口,简化与系统的交互。
- 隐藏系统的复杂性:外观模式将系统的复杂性封装在一个外观类中,客户端只需要与外观类交互,无需了解系统的内部细节。这样可以降低客户端的复杂度,并且提高系统的可维护性。
- 提供更高级别的接口:外观模式可以为客户端提供一个更高级别的接口,隐藏底层组件的细节实现,使得客户端更容易使用系统提供的功能。
- 遵循最少知识原则:外观模式有助于遵循最少知识原则,即客户端应该尽量减少与其他类的直接交互。通过使用外观模式,客户端只需与外观类进行交互,而不需要了解系统中的其他类。
4.外观模式的优缺点
优点:
- 简化接口:外观模式为客户端提供了一个简化的接口,隐藏了系统的复杂性,使得客户端更容易使用系统的功能。
- 降低耦合度:外观模式将系统的组件和客户端解耦,客户端只需要与外观类交互,而无需了解系统的内部实现细节。
- 提高可维护性:外观模式将系统的复杂性封装在一个外观类中,使得系统的变化对客户端的影响降到最低,提高了系统的可维护性和灵活性。
- 提高安全性:外观模式可以限制客户端对系统的访问,只提供必要的接口,从而提高系统的安全性。
- 提供更高级别的接口:外观模式可以为客户端提供一个更高级别的接口,隐藏底层组件的细节实现,使得客户端更容易理解和使用系统。
缺点:
- 不符合开闭原则:如果系统需要新增功能,可能需要修改外观类的实现,这会违反开闭原则,使得系统的扩展性变差。
- 可能引入性能问题:外观模式可能导致系统中出现过多的类和对象,可能会影响系统的性能。
- 可能隐藏系统的复杂性:虽然外观模式可以隐藏系统的复杂性,但有时候也可能会隐藏系统的真实问题,使得系统的设计和实现变得模糊和不清晰。