外观模式概念
以下内容摘自菜鸟教程
意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
主要解决:降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口。 何时使用:
1、客户端不需要知道系统内部的复杂联系,整个系统只需提供一个”接待员”即可。 2、定义系统的入口。
如何解决:客户端不与系统耦合,外观类与系统耦合。 关键代码:在客户端和复杂系统之间再加一层,这一层将调用顺序、依赖关系等处理好。
应用实例:
1、去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。
2、JAVA的三层开发模式。
优点:
1、减少系统相互依赖。
2、提高灵活性。
3、提高了安全性。
缺点:
不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。
使用场景: 1、为复杂的模块或子系统提供外界访问的模块。
2、子系统相对独立。
3、预防低水平人员带来的风险。
注意事项:在层次化结构中,可以使用外观模式定义系统中每一层的入口。
案例
已知,去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便
子模块
这里,我们定义了ABCD四个类,分别代表去医院看病的四个步骤,挂号、门诊、划价、取药。
public class A {
public void guahao() {
System.out.println("挂号");
}
}
public class B {
public void mengzheng() {
System.out.println("门诊");
}
}
public class C {
public void huajia() {
System.out.println("划价");
}
}
public class D {
public void quyao() {
System.out.println("取药");
}
}
facade
这里,我们定义了Facade类代表了医院的接待人员,他会替我们完成挂号、门诊、划价、取药的操作。
public class Facade {
private A a;
private B b;
private C c;
private D d;
public Facade() {
a = new A();
b = new B();
c = new C();
d = new D();
}
public void treat() {
a.guahao();
b.mengzheng();
c.huajia();
d.quyao();
}
}
测试类
public class Test {
public static void main(String[] args) {
Facade facade = new Facade();
facade.treat();
}
}
适配器模式、装饰器模式及外观模式
首先,我们先来看一下适配器模式、装饰器模式及外观模式的定义
- 适配器模式:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
在这里我们是怎么实现的呢,首先我们知道适配器模式分为类适配器和对象适配器。类适配器主要是通过继承,适配器继承需要适配的类,再实现目标接口;对象适配器是通过组合需要适配的类,实现目标接口。
- 装饰器模式:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。 -
装饰器模式实现:首先将我们需要装饰的类抽象化,提取出一个对外的接口,这是因为我们可能要装饰的类并不止一个。其次呢,我们抽象化一个装饰类,实现了需要装饰的类的抽象接口,这表明我们的装饰类,可以对装饰接口的所有实现类进行装饰。关键来了,接下来我们创建一个具体装饰类实现我们的抽象装饰类,在具体装饰类中通过组合持有需要装饰的类,并重写装饰方法。
- 外观模式:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
外观模式实现:创建一个对外接口,接口内封装了子模块,外部访问时只访问对外接口。
三者区别:
- 外观模式的意图是简化接口,只留有一个对外的接口
- 适配器模式是将我已有接口装换成不同的接口,从而给外部进行访问
- 装饰器模式是在已有的类基础上,给它拓展一些额外的职责