1. 概述
外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性。
2. 问题
为了降低复杂性,常常将系统划分为若干个子系统。但是如何做到各个系统之间的通信和相互依赖关系达到最小呢?
3. 解决方案
外观模式:为子系统中的一组接口提供一个一致的界面, Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。引入外观角色之后,用户只需要直接与外观角色交互,用户与子系统之间的复杂关系由外观角色来实现,从而降低了系统的耦合度。
4. 优缺点
Facade模式有下面一些优点:
1)对客户屏蔽子系统组件, 减少了客户处理的对象数目并使得子系统使用起来更加容易。通过引入外观模式,客户代码将变得很简单,与之关联的对象也很少。2)实现了子系统与客户之间的松耦合关系,这使得子系统的组件变化不会影响到调用它的客户类,只需要调整外观类即可。3)降低了大型软件系统中的编译依赖性,并简化了系统在不同平台之间的移植过程,因为编译一个子系统一般不需要编译所有其他的子系统。一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对象。4)只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类。Facade模式的缺点1) 不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性。2) 在不引入抽象外观类的情况下 ,增加新的子系统可能需要修改外观类或客户端的源代码, 违背了“开闭原则” 。
5. 实现
- package design.service;
- /**
- * 文件名称:ServiceA.java
- * 创建人:Fei Wong
- * 创建时间: Jun 29, 2012
- * 电子邮箱:feiwong8@126.com
- * */
- public interface ServiceA {
- /**
- * ServiceA 的A方法
- * */
- public void methodA() ;
- }
- package design.service.impl;
- /**
- * 文件名称:ServiceAImpl.java
- * 创建人:Fei Wong
- * 创建时间: Jun 29, 2012
- * 电子邮箱:feiwong8@126.com
- * */
- public class ServiceAImpl implements ServiceA {
- /* (non-Javadoc)
- * @see design.facade.ServiceA#methodA()
- */
- @Override
- public void methodA() {
- System.out.println( "methodA--> is runing" );
- }
- }
- package design.service;
- /**
- * 文件名称:ServiceB.java
- * 创建人:Fei Wong
- * 创建时间: Jun 29, 2012
- * 电子邮箱:feiwong8@126.com
- * */
- public interface ServiceB {
- /**
- * ServiceB 的B方法
- * */
- public void methodB() ;
- }
- package design.service.impl;
- /**
- * 文件名称:ServiceAImpl.java
- * 创建人:Fei Wong
- * 创建时间: Jun 29, 2012
- * 电子邮箱:feiwong8@126.com
- * */
- public class ServiceBImpl implements ServiceB {
- /* (non-Javadoc)
- * @see design.facade.ServiceA#methodA()
- */
- @Override
- public void methodB() {
- System.out.println( "methodB--> is runing" );
- }
- }
- package design.service;
- /**
- * 文件名称:ServiceC.java
- * 创建人:Fei Wong
- * 创建时间: Jun 29, 2012
- * 电子邮箱:feiwong8@126.com
- * */
- public interface ServiceC {
- /**
- * ServiceC 的C方法
- * */
- public void methodC() ;
- }
- package design.service.impl;
- /**
- * 文件名称:ServiceAImpl.java
- * 创建人:Fei Wong
- * 创建时间: Jun 29, 2012
- * 电子邮箱:feiwong8@126.com
- * */
- public class ServiceCImpl implements ServiceC {
- /* (non-Javadoc)
- * @see design.facade.ServiceA#methodA()
- */
- @Override
- public void methodC() {
- System.out.println( "methodC--> is runing" );
- }
- }
- package design.facade;
- /**
- * 文件名称:Facade.java
- * 创建人:Fei Wong
- * 创建时间: Jun 29, 2012
- * 电子邮箱:feiwong8@126.com
- *
- * 外观模式 核心类
- * */
- public class Facade {
- ServiceA sa;
- ServiceB sb;
- ServiceC sc;
- public Facade() {
- sa = new ServiceAImpl();
- sb = new ServiceBImpl();
- sc = new ServiceCImpl();
- }
- public void methodA() {
- sa.methodA();
- sb.methodB();
- }
- public void methodB() {
- sb.methodB();
- sc.methodC();
- }
- public void methodC() {
- sc.methodC();
- sa.methodA();
- }
- }
- package design.client;
- /**
- * 文件名称:Client.java
- * 创建人:Fei Wong
- * 创建时间: Jun 29, 2012
- * 电子邮箱:feiwong8@126.com
- * */
- public class Client {
- /**
- * @param args
- */
- public static void main(String[] args) {
- Facade f = new Facade();
- f.methodA();
- f.methodB();
- f.methodC() ;
- }
- }