程序员

设计模式系列之八外观模式

外观模式:提供了一个统一的接口,用来访问子系统的一群接口。外观定义了一个高层接口,让子系统更容易使用。

  下面通过一个图来说明外观模式的使用,此图来自于《Head First设计模式》一书。

外观模式

  从上图中可以看到,通过一个统一的Facade来调用复杂的子系统的类。

  按我的理解,外观模式实际上就是抽取一些公共的业务逻辑封装起来,以统一的方法来调用。使代码结构更加清晰,易于维护,避免流水代码。

  举一个简单的例子,下班回家三件事:开门、开灯、开电视。上班出门要干三件事:关电视、关灯、关门。

流水线似的写法

public class Door {
    //开门
    public void open(){

    }
    //关门
    public void close(){

    }
}
public class Light {
    //开灯
    public void on(){

    }
    //关灯
    public void off(){

    }
}
public class TV {
    //开电视
    public void on(){

    }
    //关电视
    public void off(){

    }
}
public class TestOld {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Light light = new Light();
        Door door     = new Door();
        TV tv         = new TV();
        //回家的业务逻辑
        door.open();
        light.on();
        tv.on();
        //出门的业务逻辑
        tv.off();
        light.off();
        door.close();
    }
}

使用外观模式进行封装

//外观模式的实现
public class Facade {
    TV tv;
    Light light;
    Door door;
    public Facade(Door door,Light light,TV tv){
        this.tv    = tv;
        this.light = light;
        this.door = door;
    }
    //封装回家的业务逻辑
    public void goHome(){
        door.open();
        light.on();
        tv.on();
    }
    //封装出门的业务逻辑
    public void goOut(){
        tv.off();
        light.off();
        door.close();
    }
}
public class TestNew {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Light light = new Light();
        Door door     = new Door();
        TV tv         = new TV();
        Facade facade = new Facade(door,light,tv);
        /* 1.对于后期的运维人员,只需要知道这两个方法要干的事情即可,而不需要点开看里面的具体实现逻辑
         * 2.如果是流水线的写法,则需要完完整整的把所有逻辑从头看到尾
         * 3.这样的写法让代码结构更清晰
         * 4.如果业务逻辑有变更,只需要修改对应的封装即可,而不需要去修改散落着各处的代码
         * */
        //回家逻辑
        facade.goHome();
        //出门逻辑
        facade.goOut();
    }
}

上一篇:设计模式系列之七适配器模式