标签:
客户想要购买一台电脑,一般有两种方法:
1.自己DIY,客户需要知道组成电脑的所有电子器件,并且需要熟悉那些配件,对客户要求较高。
2.去电脑组装公司,告诉他们你需要的电脑配置,再由电脑组装公司的人来组装电脑,这种方式比较简单通用,现实中一般也是这个样子。
如图所示:
DIY
交给装机公司
显然,DIY要求客户熟悉各配件的使用,联想到编程上就是客户端直接调用各个模块完成所需功能,对于客户端来说显得很麻烦。
卖CPU的公司、卖主板的公司。。。在代码中可以理解为小的模块,装机公司即为这次学习的主角“外观”。
结合编程
为子系统中的组接口提供一个一致的界面,Facade模式定义了一个高层接口(不只是Interface),这个接口使得这一子系统更加容易使用。
接口:这里的接口不一定是Interface,也有可能是一个方法,提供外部和内部交互的通道。
界面:主要指的是从一个组件外部来看这个组件,能看到什么(只能看到Facde中封装的方法),这就是组件的界面,也就是组件的外观。
使客户端操作更加简单。
通过引入一个外观类,在这个类里面定义客户端需要的方法,在这些方法中分别调用多个模块来实现某一个功能,从而使得客户端变得简单。
子系统代码(模块)
public interface Model1Api {
public void test1();
}
public class Model1Impl implements Model1Api {
public Model1Impl(){
}
public void finalize() throws Throwable {
}
public void test1(){
System.out.println("启动了Model1模块");
}
}
public interface Model2Api {
public void test2();
}
public class Model2Impl implements Model2Api {
public Model2Impl(){
}
public void finalize() throws Throwable {
}
public void test2(){
System.out.println("启动了Model2模块");
}
}
public interface Model3Api {
public void test3();
}
public class Model3Impl implements Model3Api {
public Model3Impl(){
}
public void finalize() throws Throwable {
}
public void test3(){
System.out.println("启动了Model3模块");
}
}
外观
public class Facade {
public Facade(){
}
public void finalize() throws Throwable {
}
public static void test(){
Model1Api m1 = new Model1Impl();
Model2Api m2 = new Model2Impl();
Model3Api m3 = new Model3Impl();
m1.test1();
m2.test2();
m3.test3();
}
}
客户
public class Client {
public Client(){
}
public void finalize() throws Throwable {
}
/**
*
* @param args
*/
public static void main(String[] args){
Facade.test();
}
}
外观模式的目的不是给子系统添加新的功能接口,而是为了让外部减少与子系统内多个模块的交互,松散耦合,从而让外部能更简单的使用子系统。虽然可以在外观类内定义一些子系统没有的功能,但不建议这样做,外观类的主要作用就是组装已有的功能来实现用户需要,而不是添加新的实现。
这样做会增加系统的复杂度,因为这样做还需要一个Facade的实现和一个获取Facade接口对象的工厂,客户端通过这个工厂才成生成需要的Facade接口对象。但是这样做的好处是,能够有选择性的暴露接口的方法。
优点:
1.松散耦合:降低了客户端与子系统的耦合关系,使得子系统的各个模块扩展性和可维护性增强。
2.简单易用:客户端更容易使用功能。
3.更好的划分访问的层次:把暴露给外部的功能集中到外观中,这样既方便了客户端,又隐藏了内部的具体实现细节。
缺点:
过多的或者不合理的使用Facade也容易让人迷惑,到底调用Facade好还是直接调用模块好。
外观模式作用就是组装,将子系统多个模块以某种方式拼装到一起,客户端调用时只需要调用外观类的方法就可以得到自己想要的功能。并且,客户端无需知道如何组装以及实现细节,简化了客户端的操作。有选择的暴露接口方法,方便划分访问的分层。
------博主写博客不容易,转载请注明出处,谢谢:http://www.cnblogs.com/xiemubg/p/5945720.html
标签:
原文地址:http://www.cnblogs.com/zhaoCat/p/5958972.html