外观模式(Facade)
意图
为子系统中的一组接口提供一个一致的界面,facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用
适用性
1、为一个复杂的子系统提供一个简单的接口
2、客户程序与抽象类的实现部分之间存在着很大的依赖性,Facade模式将这个子系统与客户以及其他的子系统分离
,可以提高子系统的独立性和可移植性
3、需要构建一个层次结构的子系统时,Facade模式可以定义子系统中每层的入口点
,且可以连接不同的子系统,简化子系统之间的依赖关系
结构
Facade
知道哪些子系统类负责处理请求
将客户的请求代理给适当的子系统对象
SUbsystem classes
实现子系统的功能
处理由Facade对象指派的任务
不持有指向Facade的指针
介绍
外观模式就像是一个管家,没有他,你的一天行程都有自己来办,买机票,出行,打车,准备材料等,有了这个Dacade,你可以把你的需求告诉他,它会将一系列的流程都走完,只需和管家一步流程就可以了,而不用事必躬亲(dog)0—0)。很明显,好处就是,客户的处理流程更加简单,当然你要想某一步骤自己来也是 可以的。
实现
假如小马同志之前没有管家时,下班回家之后一般要开灯,做饭,洗澡,然后看会电视。那么他要这样:
开灯
package facade;
/**
* @Author fitz.bai
* @Date 2018/8/30 16:51
*/
public class Light {
public void open(){
System.out.println("开灯");
}
}
做饭
package facade;
/**
* @Author fitz.bai
* @Date 2018/8/30 16:51
*/
public class Cook {
public void cook() {
System.out.println("做饭");
}
}
洗澡
package facade;
/**
* @Author fitz.bai
* @Date 2018/8/30 16:52
*/
public class TakeShower {
public void open() {
System.out.println("开热水器");
}
}
看电视
package facade;
/**
* @Author fitz.bai
* @Date 2018/8/30 16:53
*/
public class TV {
public void open() {
System.out.println("开电视");
}
}
回家后
package facade;
/**
* @Author fitz.bai
* @Date 2018/8/30 16:53
*/
public class GoHome {
public static void main(String[] args) {
Light light1 = new Light();
Light light2 = new Light();
Light light3 = new Light();
Cook cook = new Cook();
TakeShower takeShower = new TakeShower();
TV tv = new TV();
light1.open();
light2.open();
light3.open();
cook.cook();
takeShower.open();
tv.open();
// Facade facade = new Facade();
// facade.open();
}
}
/**
开灯
开灯
开灯
做饭
开热水器
开电视
*/
后来呢,小马有钱了,也忙了,于是请了一个管家
package facade;
/**
* @Author fitz.bai
* @Date 2018/8/30 17:00
*/
public class Facade {
private Light light;
private Cook cook;
private TakeShower takeShower;
private TV tv;
public Facade() {
light = new Light();
cook = new Cook();
takeShower = new TakeShower();
tv = new TV();
}
public void open() {
light.open();
cook.cook();
takeShower.open();
tv.open();
}
}
调用方法就在GoHome里面注释的部分,是否简单了许多,所以说外观模式是生活更加简单,科技使生活更美好
!!!
优点
1、对客户屏蔽子系统组组件,简化接口,使客户使用子系统更加方便
2、实现了子系统和客户之间的松耦合
关系
3、它不会限制
使用子系统类
缺点
1、如果不引入抽象外观类,增加新的子系统可能需要修改外观类或客户端的源代码,违背“开闭原则”
2、不能很好地限制客户使用子系统类
,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性。