免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2456 | 回复: 0
打印 上一主题 下一主题

Facade模式(转载) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-08 06:31 |只看该作者 |倒序浏览
======此文从网络上转载,并做了些补充======
GOF《设计模式》一书对Facade模式是这样描述的:
       为子系统中的一组接口提供一个统一接口。Facade模式定义了一个更高层的接口,使子系统更加容易使用。
       大致意思是说:使用一种比原有方式更简单的办法与系统交互。例如,我们把一个很重要的文件,放在了第二抽屉里,而第二个抽屉的钥匙放在了第一个抽屉里,我们要想取出这个文件,第一步肯定要拿到第一个抽屉的钥匙,然后打开它再拿出第二个抽屉的钥匙,最后打开第二个抽屉取出文件。
       我就上面说的那个情形写一下实现代码,首先我们要实现二个子系统,呵呵,把抽屉比喻成系统,有点夸张了(DrawerOne、DrawerTwo):
class DrawerOne {
    public void open(){
       System.out.println("第一个抽屉被打开了");
       getKey();
    }
    public void getKey(){
       System.out.println("得到第二个抽屉的钥匙");
    }
}
class DrawerTwo{
    public void open(){
       System.out.println("第二个抽屉被打开了");
       getFile();
    }
    public void getFile(){
       System.out.println("得到这个重要文件");
    }
}
public class Client{
    public static void main(String []args){
       DrawerOne darwerOne=new DrawerOne();
       DrawerTwo darwerTwo=new DrawerTwo();
       darwerOne.open();
       darwerTwo.open();
    }
}
由于没有使用Façade模式,可以看到要想得到这个文件要首先打开第一个抽屉,然后再打开第二个抽屉,在我们实际所开发的系统中,有时候客户要实现某一操作,并不需要知道实现这一操作的详细步骤,而是简单地点击某一个按钮就可以得到自己想要的结果。下面对上面的代码使用Façade模式进行改进,建立一个FacadeDrawer类:
class DrawerFacade{
    DrawerOne darwerOne=new DrawerOne();
    DrawerTwo darwerTwo=new DrawerTwo();
    public void open(){
       darwerOne.open();
       darwerTwo.open();
    }
}
修改Client类:
public class DrawerClient{
    public static void main(String []args){
       DrawerFacade drawer=new DrawerFacade();
       drawer.open();
    }
}
输出结果如下:
第一个抽屉被打开了
得到第二个抽屉的钥匙
第二个抽屉被打开了
得到这个重要文件
正如上面所说,客户端client,它并不需要关心子系统,而是关心DrawerFacade所留下来的和外部交互的接口,而子系统在DrawerFacade的聚合。
    Facade模式主要适用于以下几种情况:
1)    不需要使用一个复杂系统的所有功能,而且可以创建一个新的类,包含访问系统的所有规则。如果只需要使用系统的部分功能,那么你为新类所创建的API将比原系统的API简单的多。
2)    希望封装或者隐藏系统原系统。
3)    希望使用原系统的功能,而且还希望增加一些新的功能。
4)    编写新类的成本小于所有人学会使用或者未来维护原系统上所需的成本。
Fasade模式可以用下面的示意图来表示:

由上图可以看出, facade 实际上是个理顺系统间关系,降低系统间耦合度的一个常用的办法

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/67175/showart_2143541.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP