Java设计模式:外观模式的介绍及代码演示

88 阅读3分钟

外观模式介绍

外观模式的作用是将一个系统功能的具体实现细节进行隐藏,并为用户提供一个可以直接使用的功能入口,简化客户端的操作。比如说对于一名合格的司机来说,虽然并不一定了解汽车发动的原理,但是依然可以驾驶汽车,这是因为汽车作为一种交通工具,已经帮助司机隐藏了内部实现的细节,提供给司机的仅仅是驾驶汽车所必须的一些操作设备。如果用外观模式的视角去看待驾驶汽车这件事,驾驶汽车的操作设备就是提供给驾驶人的一个可使用的外观,它的内部隐藏了具体的实现原理。

290e7443cc80682e492ca10a62c16842.jpg

上面这辆汽车凡是我们能看到的地方都是它的外观,凡是我们看不到的地方都可以理解为这辆汽车的内部实现细节,它的外观隐藏了它的内部实现细节,并为驾驶人提供了可以直接使用的诸多功能。

外观模式示例代码

上面说过,外观模式隐藏了功能的具体实现细节,所以在示例代码中,首先要创建表示功能具体的实现类,然后使用外观模式隐藏它们,再为用户提供一个可以直接使用的功能接口。现在就以驾驶汽车为例,创建汽车启动的具体实现细节,并隐藏这些细节,为驾驶员提供可以直接驾驶汽车的设备功能接口。
创建启动发动机的具体实现

/**
 * 启动发动机
 */
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();
	}
}

运行结果:

image.png

运行结果显示了驾驶人当前正在驾驶汽车,但是并不会显示汽车启动和行进的原理,因为外观模式隐藏了这些内部实现细节。

总结

在程序中,如果需要简化功能的调用,就可以使用外观模式。因为外观模式隐藏了功能的具体实现,向客户端提供了一个简单调用的接口,降低了客户端与具体实现的依赖,所以外观模式提高了程序的安全性,并且降低了代码的耦合度。如果一个功能的内部实现细节需要改动,也不会对客户端造成任何影响,所以外观模式也提高了系统的灵活性。