本文源码见:https://github.com/get-set/get-designpatterns/tree/master/facadejava
门面模式(Facade Pattern)用于隐藏系统的复杂性,并向客户端提供一些简化访问方法和对现有系统类方法的委托调用。这种类型的设计模式属于结构型模式,用来隐藏系统的复杂性。git
如今政府办事愈来愈方便了,不少城市、区县都有统一的办事大厅,里边有各个部门的窗口,通常进去一圈该办的事情就齐活了。想一想以前,政府办个事情,这个部门盖个章,那个部门开个证实,不一样的部门分散在城市的不一样位置,一天有时候都办不稳当。先为这种进步点个赞!github
各个部门还在各自的地方,可是都会在办事大厅开一个窗口。其实这个办事大厅就至关于各个部门的一个总的门面,就是用到了“门面模式”。咱们如今的系统一般会愈来愈复杂,类之间的依赖调用关系逐渐变复杂,接口愈来愈多,这时候一般会用一个专门的类对某个模块或子系统进行一个包装,归置归置,简化对外提供服务的方法调用,较少方法数量。设计模式
很久没有用那个画图的例子了,这里再次搬出来。对于门面模式来讲,没有固化的类关系模型,一切以简化和封装为出发点,因此这个例子也比较简洁,领会意思便可。ide
这个例子中,有圆形、矩形和三角形三种形状,它们都继承自Shape
:设计
# Shape.java public interface Shape { void draw(); } # Circle.java public class Circle implements Shape { public void draw() { System.out.println("Draw a circle."); } } # Rectangle.java public class Rectangle implements Shape { public void draw() { System.out.println("Draw a ectangle."); } } # Triangle.java public class Triangle implements Shape{ public void draw() { System.out.println("Draw a triangle."); } }
随着形状的增多,类数量也会显著增长,这个时候若是有一个统一的类来提供各个图形的draw
功能就行了。咱们以前用这个例子解释过工厂模式,工厂模式主要是用来获取类实例的,而门面模式是统一对外提供接口调用的。本例的门面类以下:代理
ShapeDrawer.javacode
public class ShapeDrawer { private ShapeDrawer() {} public static void drawCircle() { new Circle().draw(); } public static void drawTrangle() { new Triangle().draw(); } public static void drawRectangle() { new Rectangle().draw(); } }
这里,ShapeDrawer
是做为类来使用了,由于其方法都是static
的,所以也就不用建立其对象,因此构造方法声明为私有的。使用时直接调用静态方法便可:ShapeDrawer.drawCircle();
。对象
固然,这只是一种方式,并非说门面模式就要这样作。继承
门面模式更可能是一种设计思想,而不是具体模型。目的是为子系统中的一组接口提供一个一致的界面,经过定义一个高层接口,下降访问复杂系统的内部子系统时的复杂度,使得这一子系统更加容易使用。