外观模式介绍
外观模式的作用是将一个系统功能的具体实现细节进行隐藏,并为用户提供一个可以直接使用的功能入口,简化客户端的操作。比如说对于一名合格的司机来说,虽然并不一定了解汽车发动的原理,但是依然可以驾驶汽车,这是因为汽车作为一种交通工具,已经帮助司机隐藏了内部实现的细节,提供给司机的仅仅是驾驶汽车所必须的一些操作设备。如果用外观模式的视角去看待驾驶汽车这件事,驾驶汽车的操作设备就是提供给驾驶人的一个可使用的外观,它的内部隐藏了具体的实现原理。
上面这辆汽车凡是我们能看到的地方都是它的外观,凡是我们看不到的地方都可以理解为这辆汽车的内部实现细节,它的外观隐藏了它的内部实现细节,并为驾驶人提供了可以直接使用的诸多功能。
外观模式示例代码
上面说过,外观模式隐藏了功能的具体实现细节,所以在示例代码中,首先要创建表示功能具体的实现类,然后使用外观模式隐藏它们,再为用户提供一个可以直接使用的功能接口。现在就以驾驶汽车为例,创建汽车启动的具体实现细节,并隐藏这些细节,为驾驶员提供可以直接驾驶汽车的设备功能接口。
创建启动发动机的具体实现
/**
* 启动发动机
*/
public class StartTheMotor {
public boolean start() {
return true;
}
}
创建启动变速箱的具体实现
/**
* 启动变速箱
*/
public class StartTheGearbox {
public boolean start() {
return true;
}
}
创建启动行车记录仪的具体实现
/**
* 打开行车记录仪
*/
public class StartTheRecorder {
public boolean start() {
return true;
}
}
上面三个具体实现分别启动了汽车的发动机、变速箱和行车记录仪,start()
方法返回true
,表示设备启动成功。接下来要创建一个表示外观的类,来隐藏汽车的启动细节,为驾驶人提供一个驾驶汽车的功能接口。
创建驾驶汽车外观类
/**
* 驾驶人驾驶汽车接口
*/
public class DriveCarFacade {
public void drive() {
StartTheMotor motor = new StartTheMotor();
StartTheGearbox gearbox = new StartTheGearbox();
StartTheRecorder recorder = new StartTheRecorder();
if(motor.start()&&gearbox.start()&&recorder.start()) {
System.out.println("车辆已启动,驾驶人已出发");
}
}
}
在外观类中,隐藏了汽车启动的具体原理,并为用户提供了一个驾驶汽车的功能接口drive()
,对于用户来说,能看的到的只有drive()
这个方法,方法内部的实现对于用户来说,并不需要了解。
测试外观模式
public class test_01 {
public static void main(String[] args) {
DriveCarFacade facade = new DriveCarFacade();
facade.drive();
}
}
运行结果:
运行结果显示了驾驶人当前正在驾驶汽车,但是并不会显示汽车启动和行进的原理,因为外观模式隐藏了这些内部实现细节。
总结
在程序中,如果需要简化功能的调用,就可以使用外观模式。因为外观模式隐藏了功能的具体实现,向客户端提供了一个简单调用的接口,降低了客户端与具体实现的依赖,所以外观模式提高了程序的安全性,并且降低了代码的耦合度。如果一个功能的内部实现细节需要改动,也不会对客户端造成任何影响,所以外观模式也提高了系统的灵活性。