您的位置:首页 > 其它

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

2016-12-17 16:49 204 查看
外观模式:提供了一个统一的接口,用来访问子系统的一群接口。外观定义了一个高层接口,让子系统更容易使用。

  下面通过一个图来说明外观模式的使用,此图来自于《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();
}
}


上一篇:设计模式系列之七适配器模式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: