什么是外观模式
外观模式( Facade),也叫“过程模式:外观模式为子系统中的一组接口提供个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用,并且屏蔽了内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节。
通俗的说:要实现一些连续的操作,外观模式可以使客户只需调用一个接口来而不是多个接口来达成目的。比如安装软件时的一键安装,安全软件的一键加速等。
案例
.在计算机主机( Mainframe)中,只需要按下主机的开机按钮(on()),即可调用其他硬件设备和软件的启动方法,如内存( Memory)的自检( check())、CPU的运行(run())、硬盘( HardDisk)的读取(read()、操作系统(OS)的载入(load()等,如果某一过程发生错误则计算机启动失败。使用外观模式模拟该过程,绘制类图并编程实现
传统方案下的案例分析
想要学习一个设计模式,首要的就是了解这个设计模式解决什么。
当我们不去使用案例模式的时候,会在客户端中的main()方法中创建相应的对象并且去调用各个对象的一系列方法从而实现案例。
传统方式的问题分析
man()方法中,创建各个子系统的对象,并直接去调用子系统的相关方法,可能会造成调用过程混乱,没有清晰的过程。
在客户端中也不利于维护对子系统的操作。
用外观模式解决问题的思路
我们可以定义一个高层的接口,在高层接口中去访问各个子系统中的各个方法。从而对客户端屏蔽内部子系统的细节,使得客户端只需要和这个高层接口发送调用,而不用去了解子系统的内容细节。
外观模式的UML类图
Mainframe类:外观类( Facade),为客户端提供统一的调用接口。
Client类:调用者,调用外观接口。
Memory,CPU,HardDisk,OS类:子系统,处理 Facade对象指派的任务,他是功能的实际提供者
外观模式的案例代码
子系统类
package facade;
public class Memory {
private static Memory instance = new Memory();
public static Memory getInstance() {
return instance;
}
public boolean check(boolean operIf) {
System.out.println("内存开始自检");
if (operIf) {
operIf = new java.util.Random().nextBoolean() ? true : false;
}
if (operIf) {
System.out.println("内存自检完成");
return true;
} else {
System.out.println("内存自检失败");
return false;
}
}
}
package facade;
public class CPU {
private static CPU instance = new CPU();
public static CPU getInstance() {
return instance;
}
public boolean run(boolean operIf) {
System.out.println("cpu开始运行");
if (operIf) {
operIf =new java.util.Random().nextBoolean() ? true : false;
}
if (operIf) {
System.out.println("cpu运行成功");
return true;
} else {
System.out.println("cpu运行失败");
return false;
}
}
}
package facade;
public class HardDisk {
private static HardDisk instance = new HardDisk();
public static HardDisk getInstance() {
return instance;
}
public boolean read(boolean operIf) {
System.out.println("硬盘开始读取");
if (operIf) {
operIf =new java.util.Random().nextBoolean() ? true : false;
}
if (operIf) {
System.out.println("硬盘运行成功");
return true;
} else {
System.out.println("硬盘运行失败");
return false;
}
}
}
package facade;
public class OS {
private static OS instance = new OS();
public static OS getInstance() {
return instance;
}
public boolean load(boolean operIf) {
System.out.println("操作系统开始载入");
if (operIf) {
operIf =new java.util.Random().nextBoolean() ? true : false;
}
if (operIf) {
System.out.println("操作系统载入成功");
return true;
} else {
System.out.println("操作系统载入失败");
return false;
}
}
}
外观类:聚合了各个子系统并调用其方法
package facade;
public class Mainframe {
private Memory memory;
private CPU cpu;
private HardDisk hardDisk;
private OS os;
private boolean operIf = true;
public void setOperIf(boolean operIf) {
this.operIf = operIf;
}
public Mainframe() {
super();
this.memory = memory.getInstance();
this.cpu = cpu.getInstance();
this.hardDisk = hardDisk.getInstance();
this.os = os.getInstance();
}
public void on() {
System.out.println("按下主机按钮");
operIf=memory.check(operIf);
operIf=cpu.run(operIf);
operIf=hardDisk.read(operIf);
operIf=os.load(operIf);
}
}
客户端:调用外观类的方法
package facade;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
Mainframe mainframe = new Mainframe();
mainframe.on();
}
}
总结
外观模式对外屏蔽了子系统的细节,因此外观模式降低了客户端对子系统使用的复杂性。
外观模式降低了客户端与子系统的耦合关系,让子系统内部的模块更易维护和扩展。
合理的使用外观模式,可以更好的划分访问的层次。当系统需要进行分层设计时,可以考虑使用外观模式。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。