Java设计模式百例 - 门面模式

本文源码见: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();对象

固然,这只是一种方式,并非说门面模式就要这样作。继承

  • 门面也能够是单例的,由一个单一的对象负责提供服务;
  • 门面也能够是普通的多例的,好比其要包装的目标是多个对象,那么每一个对象可能会须要一个门面实例,这个时候,门面一般也是起到一种隔离的做用,好比被包装的对象有许多接口是系统内调用的,并不对其余模块或子系统开放,而门面对象起到了一层代理的做用。

总结

门面模式更可能是一种设计思想,而不是具体模型。目的是为子系统中的一组接口提供一个一致的界面,经过定义一个高层接口,下降访问复杂系统的内部子系统时的复杂度,使得这一子系统更加容易使用。

相关文章
相关标签/搜索