门面模式(Facade)

门面模式,又称外观模式.其定义是:"外部与一个子系统的通信必须通过一个统一的门面对象进行"
我们可以把它理解为一个只有一个单例的门面类
当然,一个由多个子系统组成的大系统,可以有多个门面类

基于对定义的理解,我们认为门面模式的主要目的是为了清理客户使用接口,对实现的接口的精简.虽然不符合接口隔离原则,但是如果合理的使用此模式,对软件系统的设计还是蛮有好处.

1.结构(如下图)

1.1门面(Facade)角色:客户端可以调用这个角色的方法,此角色知晓相关的(一个或多个)子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。
1.2子系统(subsystem)角色:可以用时有一个或者多个子系统.每一个子系统都不是一个单独的类,而是一个类的集合。每一个子系统都可以被客户端直接调用,或者被门面角色调用。子系统并不知道门面的存在,对于子系统而言,门面仅仅是另一个客户端而已

2.实例
  一家医药公司,由小变大,其应用子系统。不断增加.然而,各个子系统的登录各独立.这将给公司的管理与信息安全方面带来隐患.一个合理的规划可以使,为员工设计一个只需统一登录一次即可进入多个子系统的单点登录功能,以降低了安全的分享和管理的消耗.设计图形如下

2.1医药公司单点登录接口即Facade接口。子系统
2.2子系统1、子系统2、子系统3、子系统4、子系统....,即子系统

门面模式具备以下的一些优势:
1.门面模式,通过隐藏子系统的组件,降低客户处理对象数量,以提高各个子系统的应用便捷性
2.门面模式降低子系统于客户端程序的耦合度,促进了系统的可扩展性和可维护性。
3.门面模式通过层次化的结构方式可提升系统的稳定性
基于以上几点,我认为在以下级种情形下采用门面模式进行如软件设计与实施
1.当设计者要求隐藏旧系统时,克使用门面模式的接口去实现
2.如果子系统之间的依赖性较高,可通过门面模式进行降低
3.当子系统相当复杂时,可通过门面模式提供较简单的接口,以提高至系统的易用性与稳定性

应用场景:
用电变更、用电报销、用电增容、付费等是电力公司营销系统的各个营销业务子系统,孤寡残疾老人由于身体原因,办理此类业务非常不便。为了解决这一问题,电力公司可通过设置上门服务.由上门服务人员,为孤寡残疾老人代办用电变更、用电报修、用电增容、付费业务。孤寡残疾老人员与上门服务人员联系。



实例代码如下:
package model.facade;
/*
 *电力营销业务接口
 */
public interface IElectricPowerMarketing {
	
	//代办用电变更
	public String electricityChange();
	
	//用电报修
	public String electricityBuild();
	
	//用电增容
	public String electricityAmplitude();
	
	//付费
	public String pay();
}
package model.facade;

/*
 * 电力营销业务的实现类
 */
public class IElectricPowerMarketingImpl implements IElectricPowerMarketing{
	
	//用电增容
	public String electricityAmplitude() {
		String a = "代办用电增容...";
		System.out.println(a);
		return a;
	}
	
    //用电报修
	public String electricityBuild() {
		String a = "代办用电报修...";
		System.out.println(a);
		return a;
	}
 
	//用电变更
	public String electricityChange() {
		String a = "代办用电变更...";
		System.out.println(a);
		return a;
	}
    
	//代办用点付费
	public String pay() {
		String a = "代办用电付费...";
		System.out.println(a);
		return a;
	}

}

package model.facade;
/*
 * 代办人类
 */
public class PublicAgent {
	
	private IElectricPowerMarketing electricPowerMarketing = new IElectricPowerMarketingImpl();
	
	//上门服务人员,为孤寡残疾老人提供办理、用电保修、用电增容用电变更、付费业务一体化服务
	public String sendElectricity(){
		return electricPowerMarketing.electricityChange()
		+electricPowerMarketing.electricityBuild()
		+electricPowerMarketing.electricityAmplitude()
		+electricPowerMarketing.pay();
	}
}

package model.facade;
/*
 * 客户端程序
 */
public class Client {
	
	public static void main(String[] args) {
		//上门服务代理人
		PublicAgent agent = new PublicAgent();
		agent.sendElectricity();
	}
}



门面模式在String与Hibernate中的应用,如果软件设计开发人员运用HibernateTemplate的find()方法进行信息,那么此代码就可以获取信息搜索返回List.但是find()方法其实未将以下代码进行公开
Session  sn= new sf.OpenSessio();
Query qe = sn.createQuery(hql);
for(int a = 0; a <args.length ; a++){
     qe.setParamenter(a,object)
}
qe.list();

从此处代码可以看出,HibernateTemplate类包含了SessionFactory、Session、Query等各种类的门面,它使客户端代码实现持久化查询时,仅需调用HibernateTemplate门面类的相关方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值