概述
外观模式是一个比较简单的设计模式,我们在日常的开发过程中,经常用用到它。它的本质思想就是封装交互,简化调用,它是最小知道原则的很好的体现方式,如果一个系统里面包含了很多的子系统,外部需要调用这个子系统里面的模块,如果没有外观模式的加入,外部调用系统就需要自己去单独调用内部的各个模块,这个时候,内部的情况就会暴露给外部,给系统的可扩展性造成了影响。在这种情况下,我们给内部系统做一个封装,增加一个外部系统统一调用的外观类,这会让外部系统很容易调用,因为仅仅暴露给了外部一个外观类,如果需要修改,只需要保证外观的调用方式一致即可,大大增强了内部系统的扩展性。
外观模式又以下几个优点:
- 松散耦合
- 简单易用
- 更好的划分访问层次
外观模式的uml图
模式代码示例
- 我们分别创建三个系统的api和对应的实现类
public interface ModelAApi {
void operationA();
}
public class ModelAImpl implements ModelAApi{
@Override
public void operationA() {
System.out.println("operate model A");
}
}
public interface ModelBApi {
void operationB();
}
public class ModelBImpl implements ModelBApi{
@Override
public void operationB() {
System.out.println("operate model B");
}
}
public interface ModelCApi {
void operationC();
}
public class ModelCImpl implements ModelCApi{
@Override
public void operationC() {
System.out.println("operate model C");
}
}
- 创建外观类,并封装调用方法
public class Facade {
private ModelAApi modelA;
private ModelBApi modelB;
private ModelCApi modelC;
public Facade() {
this.modelA = new ModelAImpl();
this.modelB = new ModelBImpl();
this.modelC = new ModelCImpl();
}
public void operationAll() {
this.modelA.operationA();
this.modelB.operationB();
this.modelB.operationB();
}
public void operationA() {
this.modelA.operationA();
}
public void operationB() {
this.modelB.operationB();
}
public void operationC() {
this.modelC.operationC();
}
}
- 测试客户端类
public class Client {
private Facade facade;
@Before
public void before() {
this.facade = new Facade();
}
@Test
public void testOperationAll() {
System.out.println("----------------------testOperationAll--------------------");
facade.operationAll();
}
@Test
public void testOperationA() {
System.out.println("----------------------testOperationA--------------------");
facade.operationA();
}
@Test
public void testOperationB() {
System.out.println("----------------------testOperationB--------------------");
facade.operationB();
}
@Test
public void testOperationC() {
System.out.println("----------------------testOperationC--------------------");
facade.operationC();
}
}
- 测试结果
----------------------testOperationA--------------------
operate model A
----------------------testOperationB--------------------
operate model B
----------------------testOperationC--------------------
operate model C
----------------------testOperationAll--------------------
operate model A
operate model B
operate model B
后记
个人总结,欢迎转载、评论、批评指正