外观模式,作用在于降低客户端与复杂子系统之间的耦合依赖关系。
通常一个软件系统由多个相互联系的子系统或相互联系的组件构成,客户端在使用系统的时候需要按照一定的协议去以此调用不同的子系统,进而完成一个完整的业务操作。
然而,子系统会升级,也可能被其它子系统吞并,子系统间的依赖规则可能发生变化,如此一来就必需通知客户端作出改变,这种设计不利于程序的扩展和维护。
使用外观模式,将原先对子系统的一系列调用封装到一个独立的接口中供客户端调用,客户端只需要与此接口交互,而无需关系其后面的复杂的子系统关系。
外观模式,由于其屏蔽子系统复杂性对外统一提供接口的特性,经常用于分层架构设计、模块化架构设计、交互性架构设计等。
外观模式,体现的是一种封装思想,我们经常在不经意间就会使用到。
MVC场景:系统分为三个逻辑模块(或子系统),模型:依据传入的数据,构造合适的数据模型;视图:依据数据模型,渲染出客户端需要的界面;控制器:依据用户的输入协调数据模型与视图模型的工作,要求:简单起见,用户只与控制层交互,根据用户的输入返回相应的视图,不关心模型、视图等其它组件。
设计:
示例代码:
class Model {
private String data;
public String getData() {
return data;
}
public Model doModel(String data) {
this.data = "处理后的" + data;
return this;
}
}
class View {
private Model model;
public View(Model model) {
this.model = model;
}
public String show() {
return "<html>" + model.getData() + "</html>";
}
}
class Controller {
// 外观模式的体现
public String action(String input) {// 外观模式,封装了下面一系列的操作
Model model = new Model().doModel(input);//若不使用外观模式,则需客户端自行调用
View view = new View(model); //若不使用外观模式,则需客户端自行调用
String result = view.show(); //若不使用外观模式,则需客户端自行调用
return result;
}
}
public class Test {
public static void main(String[] args) {
Controller controller = new Controller();
System.out.println(controller.action("数据"));
}
}