在软件开发中,系统可能变得非常复杂,包含多个子系统和各种交互。这些子系统之间的依赖关系和调用可能变得混乱,导致系统难以理解、扩展和维护。在这种情况下,我们需要一种方法来提供一个简单的接口,将复杂的子系统调用和依赖关系进行封装,使客户端能够轻松的与系统进行交互。
外观模式通过引入一个外观类,将复杂的子系统进行封装,为客户端提供一个简单的高层接口,外观类充当了客户端与子系统之间的中间人,处理客户端的请求并将其转发给适当的子系统。外观模式并不在系统中新添加功能,它只是提供了一个更简洁的接口,以简化客户端的操作。
外观模式的作用:
- 简化接口:客户端只需要和外观类交互,无需了解底层子系统的复杂性。
- 降低耦合:外观模式将客户端与子系统解耦,使得系统的变化不会影响客户端代码。
- 提高可维护性:由于外观模式将子系统封装起来,修改子系统的实现不会影响客户端代码,从而提高了系统的可维护性。
- 支持松散耦合:外观模式可以帮助系统重的不同模块之间实现松耦合,从而支持模块的独立开发和测试。
代码实例:
// 子系统:音响
class StereoSystem {
public void turnOn() {
System.out.println("Stereo System is turned on");
}
public void turnOff() {
System.out.println("Stereo System is turned off");
}
}
// 子系统:投影仪
class Projector {
public void turnOn() {
System.out.println("Projector is turned on");
}
public void turnOff() {
System.out.println("Projector is turned off");
}
}
// 子系统:灯光控制
class LightsControl {
public void turnOn() {
System.out.println("Lights are turned on");
}
public void turnOff() {
System.out.println("Lights are turned off");
}
}
// 外观类:家庭影院外观
class HomeTheaterFacade {
private StereoSystem stereo;
private Projector projector;
private LightsControl lights;
public HomeTheaterFacade() {
stereo = new StereoSystem();
projector = new Projector();
lights = new LightsControl();
}
public void watchMovie() {
System.out.println("Getting ready to watch a movie...");
lights.turnOff();
projector.turnOn();
stereo.turnOn();
}
public void endMovie() {
System.out.println("Ending the movie...");
stereo.turnOff();
projector.turnOff();
lights.turnOn();
}
}
// HomeTheaterFacade充当了一个外观类,封装了音响、投影仪和灯光控制等子系统的复杂操作,以便客户端可以通过简单的调用来完成观影过程。
// 这样,客户端不需要了解各个子系统的具体操作,只需通过外观类的方法来控制整个家庭影院系统的行为。
public class FacadeExample {
public static void main(String[] args) {
HomeTheaterFacade homeTheater = new HomeTheaterFacade();
// 准备观影
homeTheater.watchMovie();
// 结束观影
homeTheater.endMovie();
}
}