结构型模式
- 适配器模式(Adapter Pattern)
- 桥接模式(Bridge Pattern)
- 组合模式(Composite Pattern)
- 装饰器模式(Decorator Pattern)
- 外观模式(Facade Pattern)
- 享元模式(Flyweight Pattern)
- 代理模式(Proxy Pattern)
外观模式是一种结构型设计模式,其核心思想是为复杂的子系统提供一个统一的接口,使得客户端与复杂的子系统进行交互时更加简单,避免直接与多个子系统类进行交互。通过外观模式,客户端可以通过一个简单的接口来调用复杂的操作,降低了系统的复杂度,提升了可用性。
外观模式的目的:
- 简化接口:外观模式通过定义一个简单的接口,向客户端隐藏了系统的复杂性。客户端只需要通过外观接口进行操作,而无需了解系统内部的细节。
- 减少依赖:外观模式帮助客户端减少与复杂子系统的依赖,降低了代码的耦合度。
外观模式的结构:
外观模式通常涉及以下角色:
- Facade(外观类):提供一个高层接口,客户端通过这个接口来调用子系统的功能,外观类将客户端的请求委托给适当的子系统类。
- Subsystem Classes(子系统类):一个或多个子系统类,它们负责处理实际的业务逻辑。外观类调用这些子系统类来完成客户端请求的操作。
外观模式的示例:家庭影院系统
假设我们有一个家庭影院系统,它包括多个设备:DVD播放器、音响系统、投影仪等。每个设备都有复杂的控制接口,客户端如果直接与这些设备交互会显得很麻烦。为了简化操作,我们可以使用外观模式提供一个统一的接口,使得用户只需要通过外观接口进行操作。
// 投影仪
class Projector {
public void on() {
System.out.println("投影仪开机");
}
public void off() {
System.out.println("投影仪关机");
}
public void setInput(String input) {
System.out.println("设置投影仪输入源为: " + input);
}
}
// 音响系统
class SoundSystem {
public void on() {
System.out.println("音响系统开机");
}
public void off() {
System.out.println("音响系统关机");
}
public void setVolume(int level) {
System.out.println("设置音响音量为: " + level);
}
}
// DVD播放器
class DVDPlayer {
public void on() {
System.out.println("DVD播放器开机");
}
public void off() {
System.out.println("DVD播放器关机");
}
public void play(String movie) {
System.out.println("播放电影: " + movie);
}
}
class HomeTheaterFacade {
private Projector projector;
private SoundSystem soundSystem;
private DVDPlayer dvdPlayer;
public HomeTheaterFacade(Projector projector, SoundSystem soundSystem, DVDPlayer dvdPlayer) {
this.projector = projector;
this.soundSystem = soundSystem;
this.dvdPlayer = dvdPlayer;
}
// 开启家庭影院
public void watchMovie(String movie) {
System.out.println("准备观看电影...");
projector.on();
projector.setInput("DVD");
soundSystem.on();
soundSystem.setVolume(10);
dvdPlayer.on();
dvdPlayer.play(movie);
}
// 关闭家庭影院
public void endMovie() {
System.out.println("结束电影...");
projector.off();
soundSystem.off();
dvdPlayer.off();
}
}
public class Client {
public static void main(String[] args) {
// 创建子系统对象
Projector projector = new Projector();
SoundSystem soundSystem = new SoundSystem();
DVDPlayer dvdPlayer = new DVDPlayer();
// 创建外观对象
HomeTheaterFacade homeTheater = new HomeTheaterFacade(projector, soundSystem, dvdPlayer);
// 客户端只需要通过外观类来操作
homeTheater.watchMovie("《复仇者联盟》");
homeTheater.endMovie();
}
}