外观模式:提供了一个统一的接口,用来访问子系统的一群接口。外观定义了一个高层接口,让子系统更容易使用。
下面通过一个图来说明外观模式的使用,此图来自于《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();
}
}
上一篇:<a href="http://muchstudy.com/2016/12/14/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E7%B3%BB%E5%88%97%E4%B9%8B%E4%B8%83%E9%80%82%E9%85%8D%E5%99%A8%E6%A8%A1%E5%BC%8F/">设计模式系列之七适配器模式</a>
网友评论