【java】设计模式之门面模式

public class Police {
	public void checkLetter(){
		System.out.println("police检查");
	}
}

门面模式(facade pattern)

定义:提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使用子系统更容易使用。

按照惯例,先假设一个环境,这里借用《设计模式之禅》里面的例子:

假如一个人写信,从写信到发送的过程需要如下步骤:

1、写信(writeLetter)

2、写地址(fillEnvelope)

3、装到信封里(letterIntoEnvolope)

4、发送(sendLetter)

如果按照平常状态写代码,类图如下:


LetterProcess类

public class LetterProcess implements ILetterProcess {
	
	@Override
	public void writeLetter(String letterWord){
		System.out.println("写信:"+letterWord);
	}
	@Override
	public void fillEnvelope(String address){
		System.out.println("写地址:"+address);
	}
	@Override
	public void letterIntoEnvelope(){
		System.out.println("装信封");
	}
	@Override
	public void sendLetter(){
		System.out.println("发送");
	}
}


test

public static void main(String[] args) {
		ILetterProcess lp = new LetterProcess();
		lp.writeLetter("最近过的怎么样......");
		lp.fillEnvelope("中国北京......");
		lp.letterIntoEnvelope();
		lp.sendLetter();
	}

写信,写地址,装信封,发信的过程都交给了客户端去实现,不符合高内聚的要求,而且客户端必须严格按照这四个步骤的顺序。

那么如何改进呢?

假设有一家邮局,然后这家邮局说:只要你把内容和地址告诉我,我帮你做这四个步骤,这样的话,你就省了很多麻烦,而且还有其他好处。

把这四个过程封装成一个类(PostOffice),由这个类去处理,客户端只要调用这个类就好了。

PostOffice:

public class PostOffice {
	ILetterProcess lp= new LetterProcess();
	public void dealLetter(String LetterWord,String address){
		lp.writeLetter(LetterWord);
		lp.fillEnvelope(address);
		lp.letterIntoEnvelope();
		lp.sendLetter();
	}
}

test:

public static void main(String[] args) {
		PostOffice po = new PostOffice();
		po.dealLetter("今天天气还不错.......", "中国上海.......");
	}

门面模式下的类图:



这样一看,客户端是不是省却了很多麻烦?而邮局说的好处失是什么呢?

假如有警察需要检查信封的内容,直接由PostOffice类调用这个类就好了,不需要与客户端有关。


Police类:

public class Police {
	public void checkLetter(){
		System.out.println("police检查");
	}
}
PostOffice类:

public class PostOffice {
	ILetterProcess lp= new LetterProcess();
	Police p = new Police();
	public void dealLetter(String LetterWord,String address){
		lp.writeLetter(LetterWord);
		lp.fillEnvelope(address);
		p.checkLetter();
		lp.letterIntoEnvelope();
		lp.sendLetter();
	}
}


类图:



优点:采用facade模式,封装一个复杂的运算(或者小系统),降低了依赖关系,使用的时候只需要调用facade模式提供的接口即可,,而无需关心内部实现(有点像函数),符合模块间的高内聚,低耦合。

缺点:内部功能改变的时候,需要修改代码,不符合开闭原则。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值