java设计模式之Facade模式

关于Facade模式,有人翻译为外观模式,有人翻译为门面模式。我最早接触这种设计模式是在杭州的时候,那个时候服务端的Facade层主要有2个作用,一个是提供给Flex客户端的接口用。一个是作为包含多个service操作的统一接口。GoF《设计模式》中说道:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。其实大多数人对于Facade层的理解是为多个复杂的动作提供一个入口。

来看一个网上广为流传的例子:

比如有一个抽屉,里面存放了很大的重要文件,我们称这个抽屉为第二个抽屉,它的钥匙放在另一个抽屉,我们称之为第一个抽屉,只有拿到第一个抽屉里的钥匙,才能打开第二个抽屉。

package com.howlaa.facadeMode;

/**
 *  抽屉一
 * @author howlaa
 */
public class DrawerOne {
	public String open(){
		System.out.println("第一个抽屉打开...");
		return getKey();
	}
	public String getKey(){
		System.out.println("得到第二个抽屉的钥匙...");
		return "钥匙";
	}
}
package com.howlaa.facadeMode;

/**
 * 抽屉二 
 * @author howlaa
 */
public class DrawerTwo {
	public void open(String key){
		if("钥匙".equals(key)){
			System.out.println("第二个抽屉打开...");
			getFile();
		}else
		{
			System.out.println("钥匙不匹配,不法打开第二个抽屉...");
			return ;
		}
		
	}
	public void getFile(){
		System.out.println("取得重要文件...");
	}
}


 

现在我们来看下,当不使用Facade模式时,客户端如果用户想拿到这个重要文件是怎样的:

package com.howlaa.facadeMode;

import org.junit.Test;

/**
 * 客户端
 * @author howlaa
 *
 */
public class Client {
	/*-------当未使用Facade模式时---------*/
	@Test
	public void NotUseFacade(){
		DrawerOne drawerOne = new DrawerOne();
		String key = drawerOne.open();
		DrawerTwo drawerTwo = new DrawerTwo();
		drawerTwo.open(key);
	}
	/*-------end 未使用Facade模式---------*/
}


 

可以看到,用户必须先去打开第一个抽屉,才能用这个钥匙去打开第二个抽屉。在实际中,可能用户不知道这个必要条件。他只知道他需要的就是打开抽屉,然后拿到文件。我们来看下使用Facade模式时的状况:

首先,我们需要新建一个Facade类:

package com.howlaa.facadeMode;

public class DrawerFacade {
	DrawerOne drawerOne = new DrawerOne();
	DrawerTwo drawerTwo = new DrawerTwo();
	public void open(){
		String key = drawerOne.open();
		drawerTwo.open(key);
	}
}


然后看下客户端的操作:

package com.howlaa.facadeMode;

import org.junit.Test;

/**
 * 客户端
 * @author howlaa
 *
 */
public class Client {	
	/*--------使用Facade模式--------------*/
	@Test
	public void UseFacade(){
		DrawerFacade drawerFacade = new DrawerFacade();
		drawerFacade.open();
	}
	/*--------end 使用Facade模式----------*/
}


这里可以看到,客户端的用户只是做了打开,拿文件的操作。服务端怎么操作的,他无须关心。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值