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("发送");
}
}
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模式提供的接口即可,,而无需关心内部实现(有点像函数),符合模块间的高内聚,低耦合。
缺点:内部功能改变的时候,需要修改代码,不符合开闭原则。