如果只看代码的话,应该可以说Facade pattern(门面设计模式,也可以叫前台接待模式)是一种最简单的代码结构,不就封装吗!这玩意谁不会!
还是看它背后所蕴含的思想吧,看了之后发现背后的思想也很简单,非常好理解。 - -。
Think
Encapsulation:
在物理世界中,从古代的弹药
到子弹
的发展其实就是对弹药的封装
,因此大大提高了装弹效率。经过演化,发现一次装一发子弹还是不够高效,如果再进一步,在子弹外再封装一层弹夹
的话则会更显著地提升效率。
在Java编程中,一对大括号{ }
就是类、方法等结构的外壳、边界,它能很好地把类的各种属性及行为包裹起来,将它们封装在类内部并固化成一个整体。封装好的类如同一个黑匣子,外部无法看到内部的构造及运转机制,而只能访问其暴露出来的属性或方法。
门面设计模式:
本质上来讲,它和封装的含义是一样的,无非是一般概念里的封装只是针对同一个类内的属性,方法进行封装,这里的封装更泛一些,能包含更广泛的子系统的方法。
门面设计模式可以隐藏系统的内部复杂性,提供一个简化的操作接口,使得客户端更容易使用系统。
该模式通过提供一个高层次的接口,将一个或多个子系统的复杂操作封装起来,使得客户端只需要与门面对象进行交互,而不需要直接与子系统的各个组件进行通信。这样可以减少客户端与子系统之间的耦合,降低了系统的复杂性,同时提供了一种简洁、统一的界面。
Example - 音响系统
假设我们有一个音响系统,包含多个子系统组件,如音频播放器、发光灯和温度控制器。我们可以创建一个音响门面类,负责封装这些子系统的复杂操作,并提供一个简单的接口供客户端使用。
// 子系统组件 - 音频播放器
class AudioPlayer {
public void play() {
System.out.println("播放音频");
}
}
// 子系统组件 - 发光灯
class Light {
public void turnOn() {
System.out.println("打开发光灯");
}
}
// 子系统组件 - 温度控制器
class TemperatureController {
public void setTemperature(int temperature) {
System.out.println("设置温度为:" + temperature + "℃");
}
}
// 音响门面类
class StereoFacade {
private AudioPlayer audioPlayer;
private Light light;
private TemperatureController temperatureController;
public StereoFacade() {
audioPlayer = new AudioPlayer();
light = new Light();
temperatureController = new TemperatureController();
}
// 提供简化的接口
public void startMusic() {
audioPlayer.play();
light.turnOn();
temperatureController.setTemperature(25);
System.out.println("音乐系统已启动");
}
}
// 客户端代码
public class Main {
public static void main(String[] args) {
StereoFacade stereo = new StereoFacade();
stereo.startMusic();
}
}
在上述代码中,StereoFacade类
充当门面类,它封装了音频播放器、发光灯和温度控制器的复杂操作。客户端代码只需要与StereoFacade交互,通过调用startMusic方法
,即可启动音响系统,而无需关心底层子系统的具体实现细节。
通过门面模式,客户端代码与子系统之间的耦合度得到降低,系统的复杂性得到简化,同时提供了一个简单、统一的接口,便于客户端的使用。