二、外观模式
外观模式为他的子系统提供一个接口,使子系统能够更加方面的使用。使用外观模式,只需要少量代码,就能提供典型的、无修饰用法的类库中的类。一个外观就是一个类,它包含的功能介于工具包与完整的应用程序之间,为工具包或子系统的类提供了简单的用法。
外观类、工具类和示例类
外观类的方法可能都是静态方法,这种情况下,外观类在UML中被称作工具类。示例类就是演示如何使用类或子系统的例子。外观类所能提供的诸多使得之处,示例类也能提供。外观类可能属于类库,但实例类一定不属于类库。
在软件开发过程中,程序一般会越做越大,而这样系统中类及子系统之间的影响会使彼此间的关系变得错综复杂即过多的耦合,这就导致了随着系统中类或子系统发生变化,与之相关联的子系统或类就需要发生变化。
举例
电源总开关
为了使用方便,一个电源总开关可以控制两盏灯、一台空调和一台电视机的启动和关闭。通过该电源总开关可以同时控制上述所有电器设备,使用外观模式设计该系统。
外观模式的目的在于降低系统的复杂程度。
外观模式从很大程度上提高了客户端使用的便捷性,使得客户端无须关心子系统的工作细节,通过外观角色即可调用相关功能。
外观模式实例与解析
以计算机的加载和关闭过程为例
子系统角色:CPU、内存和硬盘。
外观角色:计算机。
客户:用户。
它们之间的依赖关系如图所示:
下面来看具体的实现。
(1)CPU类CPU.java 其中定义了启动和关闭CPU的函数。
CPU类CPU.java
package structure.facade;
public class CPU {
public void startup() { }
public void shutdown() { }
}
(2)内存类Memory.java其中定义了加载和清空内存的函数。
内存类Memory.java
package structure.facade;
public class Memory {
public void startup() { }
public void shutdown() { }
}
(3)硬盘类Disk.java其中定义了加载和卸载硬盘的函数。
硬盘类Disk.java
package structure.facade;
public class Disk {
public void startup() { }
public void shutdown() { }
}
(4)外观模式类Computer.java 其中包含了CPU、内存和硬盘3个类对象,并定义了启动和关闭计算机的函数,在启动和关闭时批量地启动和关闭CPU、内存和硬盘。
外观模式类Computer.java
package structure.facade;
/* 外观模式 */
public class Computer {
private CPU cpu = new CPU(); …….
//声明对象
public void startup() { // 调用对象的方法 }
public void shutdown() {// 调用对象的方法 }
}
(5)用户类User.java,我们只需要调用Computer.java的函数来启动和关闭计算机,而不需要依次加载和关闭CPU、内存和硬盘。
用户类User.java
package structure.facade;
public class User {
public static void main(String args[]) {
Computer computer = new Computer();
computer.startup(); //调用
computer.shutdown();
}
}
总结:
从程序可以看出,通过Computer一个外观类即可实现计算机所有部件的控制,而不需要单独去控制其所有的部件,这正是外观模式的作用。