设计模式-外观模式(又称门面模式)以及在JDK类库中的应用

外观模式

定义

为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,此接口使得子系统更加容易使用。

类图

设计模式-外观模式(又称门面模式)以及在JDK类库中的应用_第1张图片

结构

子系统类(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();
	}

测试结果

设计模式-外观模式(又称门面模式)以及在JDK类库中的应用_第2张图片

优点

1.减少系统的相互依赖

2.避免直接访问子系统的内部方法

缺点

不符合开放封闭原则

JDK类库中的外观模式

java.lang.Class

javax.faces.webapp.FacesServlet

Class中的forName(String name, boolean initialize ,ClassLoader loader)方法调用了ClassLoader、System接口。

FacesServlet实现了Servlet接口,在实现方法service()中调用了HttpServletRequest、HttpServletResponse、ApplicationContext接口的方法。

你可能感兴趣的:(设计模式,设计模式轻松学)