Facade外观模式
2015-08-22 01:07
501 查看
外观模式(Facade)是结构型设计模式,外观模式就是为一个子系统中的多个类提供统一接口的方法,把一个组件单元构建为一个子系统有助于减少软件的复杂性,而且可以使子系统与其他组件的通信关系更加间接、易控制,可以最大限度的降低组件间的耦合度。达到这一个目标的最好方法就是引进一个外观类,让它为子系统的通用功能提供一个简单一致的公共接口。
在别处看到一个例子,就是组装电脑,需要一台电脑,你可以去电子城,选择主板、显示器、CPU、各种外设等组装一台电脑。当然,为了方便,也可以直接找一家装机公司,它们负责将各种电脑组件组装好。这就是外观模式的概念。外观模式就是将多个关系比较复杂的类放到一个外观类中统一处理,从而外部调用起来只要与外观打交道,而不必清楚内部各个类之间的调用关系,简化了客户端调用的复杂度。
考虑一下在ATM取款的系统:
系统接口:
子系统2:
如果不使用facade模式,则客户端程序:
如果银行在某一天要增加ATM取款的安全,要增加ATM取款时候的步骤,增加步骤A,那么必须要修改客户端程序,这样代价就高了。如果使用Facade模式,则编写Facade类:
客户端代码:
这样如果要做出上述修改,则只需修改Facade类和增加子系统即可,不用修改Client程序。
综上所述,Facade模式的优点:
1.松散耦合。外观模式松散了客户端与子系统的耦合关系,让子系统内部的模块可以更容易扩展和维护。
2.简单易用。外观模式让子系统更易用,客户商无需要了解子系统的内部细节,更不需要与各子系统模块进行交互,只需要与外观对象进行交互就可以呢,由外观模式为客户端提供一站式服务。
在别处看到一个例子,就是组装电脑,需要一台电脑,你可以去电子城,选择主板、显示器、CPU、各种外设等组装一台电脑。当然,为了方便,也可以直接找一家装机公司,它们负责将各种电脑组件组装好。这就是外观模式的概念。外观模式就是将多个关系比较复杂的类放到一个外观类中统一处理,从而外部调用起来只要与外观打交道,而不必清楚内部各个类之间的调用关系,简化了客户端调用的复杂度。
考虑一下在ATM取款的系统:
系统接口:
package facade; public interface GetMoney { public void doThings(); }子系统1:
package facade; public class InsertCards implements GetMoney{ public InsertCards() { } @Override public void doThings() { // TODO Auto-generated method stub //Do something System.out.println("插入银行卡..."); } }
子系统2:
package facade; public class PassWord implements GetMoney{ public PassWord() { } @Override public void doThings() { // TODO Auto-generated method stub //Do something System.out.println("输入密码..."); } }子系统3:
package facade; public class GetCash implements GetMoney{ public GetCash() { } @Override public void doThings() { // TODO Auto-generated method stub //Do something System.out.println("取出现金..."); } }
如果不使用facade模式,则客户端程序:
package facade; public class Client_Without_Facade { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub InsertCards insertcards = new InsertCards(); insertcards.doThings(); PassWord password = new PassWord(); password.doThings(); GetCash getcash = new GetCash(); getcash.doThings(); System.out.println("Succeed to get money!"); } }
如果银行在某一天要增加ATM取款的安全,要增加ATM取款时候的步骤,增加步骤A,那么必须要修改客户端程序,这样代价就高了。如果使用Facade模式,则编写Facade类:
package facade; public class Facade { public Facade() { } public void doThings() { InsertCards insertcards = new InsertCards(); insertcards.doThings(); PassWord password = new PassWord(); password.doThings(); GetCash getcash = new GetCash(); getcash.doThings(); } }
客户端代码:
package facade; public class Client { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Facade facade = new Facade(); facade.doThings(); System.out.println("Succeed to get money!"); } }
这样如果要做出上述修改,则只需修改Facade类和增加子系统即可,不用修改Client程序。
综上所述,Facade模式的优点:
1.松散耦合。外观模式松散了客户端与子系统的耦合关系,让子系统内部的模块可以更容易扩展和维护。
2.简单易用。外观模式让子系统更易用,客户商无需要了解子系统的内部细节,更不需要与各子系统模块进行交互,只需要与外观对象进行交互就可以呢,由外观模式为客户端提供一站式服务。
相关文章推荐
- [LeetCode#216]Combination Sum III
- 数据库集群
- MapReduce Job 全局共享数据
- SPOJ 10628 Count on a tree (lca+主席树)
- 版本问题的坑
- HDU 2094 产生冠军(水题 map使用)
- POJ 1663 解题报告
- HDU 5414 CRB and String(贪心)
- 线程自动加锁与自动解锁:lock_guard & unique_lock
- IOS Storybroad和纯代码界面互联
- jQuery插件开发精品教程
- 搭建apache+php+mysql环境七部曲
- 老公,你说的是真的吗
- shell 脚本教程 入门级
- POJ1005 I Think I Need a Houseboat
- W: GPG error: http://extras.ubuntu.com precise Release
- Hibernate——Hql实例+详解
- 游戏开发中的原则性问题总结(持续更新)
- Java的堆和栈
- 技术收集