23种设计模式之门面模式

23种设计模式之门面模式

文章目录

参考资料

下文如有错漏之处,敬请指正

一、简介

定义

为多个复杂的子系统提供一个一致的接口,使调用端只能跟该接口进行交互,而无需关心子系统的内部细节。

(门面模式好比你要去注册公司,自己办理有很多流程,最简单的方法就是找代理注册,你跟代理注册的业务员对接,业务员帮你跟相关*部门对接)

特点

  • 门面模式是一种结构型模式

通用类图

23种设计模式之门面模式

门面模式的重要角色:

  • Facade

    门面角色

    为多个子系统对外提供一个同一的接口,它包含了对各个子系统的引用,客户端可以通过它访问各个子系统的功能。

  • SubSystem

    子系统角色

    可以同时有一个或者多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。子系统并不知道门面的存在。对于子系统而言,门面仅仅是另外一个客户端而已。

  • Client

    客户端角色

    通过门面角色访问各个子系统的功能。

优点

  • 减少系统的相互依赖

    如果我们不使用门面模式,外界访问直接深入到子系统内部,相互之间是一种强耦合关系,你死我就死,你活我才能活,这样的强依赖是系统设计所不能接受的,门面模式的出现就很好地解决了该问题,所有的依赖都是对门面对象的依赖,与子系统无关。

  • 提高了灵活性

    依赖减少了,灵活性自然提高了。不管子系统内部如何变化,只要不影响到门面对象,任你*活动。

  • 降低了子系统与客户端之间的耦合,使得子系统的变化不会影响调用它的客户类。

  • 提高安全性

    对客户端屏蔽了子系统组件,想让你访问子系统的哪些业务就开通哪些逻辑,不在门面上开通的方法,你休想访问到。

  • 降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程,因为编译一个子系统不会影响其他的子系统,也不会影响门面对象。

缺点

  • 增加新的子系统可能需要修改门面类或客户端的代码,违背了“开闭原则”,如果引入抽象门面类,则可以在一定程度上解决了该问题。

应用场景

  • 对分层结构系统构建时,使用门面模式定义子系统中每层的入口点可以简化子系统之间的依赖关系。
  • 当一个复杂系统的子系统很多时,门面模式可以为系统设计一个简单的接口供外界访问。
  • 当客户端与多个子系统之间存在很大的联系时,引入门面模式可将它们分离,从而提高子系统的独立性和可移植性。

二、门面模式

需求:

客户需要去注册公司,注册公司需要5步(这里为5步,也就是有五个子系统),客户找了代理注册帮他注册(代理注册就是门面)

子系统:

package facade;

public class Step1 {
  //	内部可能有着复杂的处理
      //	do1
      //	do2
      //	do3
      //	do...n
    public void fun(){
        System.out.println("完成步骤一");
    }
}
package facade;

public class Step2 {
    //	内部可能有着复杂的处理
    //	do1
    //	do2
    //	do3
    //	do...n
    public void fun(){
        System.out.println("完成步骤二");
    }
}
package facade;

public class Step3 {
    //	内部可能有着复杂的处理
    //	do1
    //	do2
    //	do3
    //	do...n
    public void fun(){
        System.out.println("完成步骤三");
    }
}
package facade;

public class Step4 {
    //	内部可能有着复杂的处理
    //	do1
    //	do2
    //	d03
    //	do...n
    public void fun(){
        System.out.println("完成步骤四");
    }
}
package facade;

public class Step5 {
    //	内部可能有着复杂的处理
    //	do1
    //	do2
    //	do3
    //	do...n
    public void fun(){
        System.out.println("完成步骤五");
    }
}

门面:

package facade;

public class Facade {
	//  被委托的对象,即子系统组件
	private Step1 step1;
	private Step2 step2;
	private Step3 step3;
	private Step4 step4;
	private Step5 step5;

	public Facade() {
		step1 = new Step1();
		step2 = new Step2();
		step3 = new Step3();
		step4 = new Step4();
		step5 = new Step5();
	}

	//  提供给外部访问的方法
	public void todo() {
		step1.fun();
		step2.fun();
		step3.fun();
		step4.fun();
		step5.fun();
	}

	public void todo1() {
		step1.fun();
	}

	public void todo2() {
		step1.fun();
		step3.fun();
	}

}

Client:

package facade;

public class Client {
	public static void main(String[] args) {
		Facade facade = new Facade();
		facade.todo();
		/**
		 * 输出结果:
		 * 完成步骤一
		 * 完成步骤二
		 * 完成步骤三
		 * 完成步骤四
		 * 完成步骤五
		 */
	}
}

三、总结

门面模式是一个很好的封装方法,一个子系统比较复杂时,比如算法或者业务比较复杂,就可以封装出一个或多个门面出来,项目的结构简单,而且扩展性非常好。还有,对于一个较大项目,为了避免人员带来的风险,也可以使用门面模式。

上一篇:外观模式初理解


下一篇:Facade外观模式