为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,此接口使得子系统更加容易使用。
子系统类(subsystem):实现子系统的功能,处理facade对象指派的任务。
package com.headfirst.facademode.dao;
public class SubSystemA {
public void methodA(){
System.out.println("子系统A执行方法A");
}
}
package com.headfirst.facademode.dao;
public class SubSystemB {
public void methodB(){
System.out.println("子系统B执行方法B");
}
}
package com.headfirst.facademode.dao;
public class SubSystemC {
public void methodC(){
System.out.println("子系统C执行方法C");
}
}
外观类(facade):负责调用子系统的方法。
package com.headfirst.facademode.dao;
public class Facade {
private SubSystemA a;
private SubSystemB b;
private SubSystemC c;
public Facade(){
a = new SubSystemA();
b = new SubSystemB();
c = new SubSystemC();
}
public void execute(){
a.methodA();
b.methodB();
c.methodC();
}
}
测试类
public static void main(String[] args) {
Facade facade = new Facade();
facade.execute();
}
结果
这里我以炒股为例,我们都知道炒股是一项技术活,需要掌握大量的金融知识和经验的人才能从炒股中获利,一般的人根本不可能精通金融常识,所以我们把买股票,买债券,买基金这个技术活交给基金管理人来管理,我们只负责收益,其他的事情都不用管,基金管理人充当外观类的角色,买卖股票,买卖基金,买卖债券就充当子系统的实现类。
股票类
package com.headfirst.facademode.dao;
public class Stock {
public void buy(){
System.out.println("买入股票");
}
public void sell(){
System.out.println("卖出股票");
}
}
基金类
package com.headfirst.facademode.dao;
public class Fund {
public void buy(){
System.out.println("买入基金");
}
public void sell(){
System.out.println("卖出基金");
}
}
债券类
package com.headfirst.facademode.dao;
public class Bond {
public void buy(){
System.out.println("买入债券");
}
public void sell(){
System.out.println("卖出债券");
}
}
基金管理人类
package com.headfirst.facademode.dao;
public class FundManager {
private Stock stock;
private Fund fund;
private Bond bond;
public FundManager(){
stock = new Stock();
fund = new Fund();
bond = new Bond();
}
public void buyFund(){
stock.buy();
fund.buy();
bond.buy();
}
public void sellFund(){
stock.sell();
fund.sell();
bond.sell();
}
}
测试类
public static void main(String[] args) {
FundManager fundManager = new FundManager();
fundManager.buyFund();
fundManager.sellFund();
}
测试结果
1.减少系统的相互依赖
2.避免直接访问子系统的内部方法
不符合开放封闭原则
java.lang.Class
javax.faces.webapp.FacesServlet
Class中的forName(String name, boolean initialize ,ClassLoader loader)方法调用了ClassLoader、System接口。
FacesServlet实现了Servlet接口,在实现方法service()中调用了HttpServletRequest、HttpServletResponse、ApplicationContext接口的方法。