生活中,有这样一类问题。一个系统会向外部提供一些服务,但在某些系统,例如银行系统等,出于自我保护,并不向外界显示具体操作过程。而所提供的这些服务,很可能是系统内部各种操作的组合并执行的结果。如果将这种行事方式用于面向对象编程,势必会更符合面向对象的基本原则,达到高内聚,低耦合。
外观模式的应用场景:在真实的应用系统中,一个子系统可能由很多类组成。子系统的客户为了它们的需要,需要和子系统中的一些类进行交互。客户和子系统的类进行直接的交互会导致客户端对象和子系统之间高度耦合。任何的类似于对子系统中类的接口的修改,会对依赖于它的所有的客户类造成影响。 外观模式(Facade pattern)为子系统提供了一个更高层次、更简单的接口,从而降低了子系统的复杂度和依赖。这使得子系统更易于使用和管理。—— http://dev.yesky.com/203/2175203.shtml
以银行为例,我们使用ATM机,银行系统为我们提供查询、取款的服务。客户想要获得查询、取款等服务,必须调用银行系统内相关的方法,但银行为了系统安全,必须要使得它们对客户不可见,但相关服务依旧要提供。于是,就有了ATM这个设备,使得在内部不透明的情况下,服务依旧不受影响。客户就可以通过ATM获得相关服务,但不知道其具体操作。
所谓外观模式就是这个道理。在不影响提供相关服务的情况下,将实现方法封装起来,通过FacadePattern里组合相关方法,向外提供服务。
如上图,就是银行ATM的实例的模型。
代码示例如下:
系统内,处理类,用于处理用户请求
package fP1;
public class Deal {
// chang method
public void change() {
System.out.println("do some changs!");
}
// submit method
public void submit() {
System.out.println("has submitted!");
}
}
系统内,账户类,用于账户服务
package fP2;
public class Credit {
// get the Credit method
public void getCredit() {
System.out.println("has got the Credit!");
}
// set the properties
public void setCredit() {
System.out.println("has set the Credit!");
}
}
FacadePattern,ATM类,系统内与外的接口,系统内各类方法的组合,以对外提供服务
package facadePattern;
import fP1.Deal;
import fP2.Credit;
public class ATM {
private Credit credit = new Credit();
private Deal deal = new Deal();
// search method
public void search() {
System.out.println("custom want to search Credit!");
credit.getCredit();
deal.submit();
}
// save money method
public void save() {
System.out.println("custom want to save money!");
deal.change();
credit.setCredit();
deal.submit();
}
}
系统外,用户类
package facadePattern;
public class Custom {
// user's name
private String name = "ailse";
// get method
public String getname() {
return name;
}
}
测试及结果
package facadePattern;
public class Test {
public static void main(String[] args) {
Custom custom = new Custom();
String name = custom.getname();
System.out.println(name + " is doing somthing with the ATM");
ATM atm = new ATM();
System.out.println(name + " search the Credit!");
atm.search();
System.out.println(name + " save money!");
atm.save();
}
}
由结果显而易见,内部方法随对外部对象不可见,但仍不影响外部服务的提供。面对改变内部业务流程改变时,只用改相应的内部方法,却不会影响外部。可以很好的隔离外界用户和内部系统。