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

外观模式(又称门面模式)提供了一致的接口,简化了子系统的使用。在股票交易示例中,基金管理人作为外观角色,处理股票、基金和债券的买卖。这种模式减少了系统间的依赖,但可能不符合开放封闭原则。JDK中的`java.lang.Class`和`javax.faces.webapp.FacesServlet`是外观模式的实际应用,如`Class`的forName()方法调用其他接口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

外观模式

定义

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

类图

结构

子系统类(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.避免直接访问子系统的内部方法

缺点

不符合开放封闭原则

JDK类库中的外观模式

java.lang.Class

javax.faces.webapp.FacesServlet

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值