版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ddxxii/article/details/84107981
介绍
外观模式,提供一个统一的接口供使用者访问,隐蔽内部实现,制作API必备。应该每一个开发者都会使用到,因为你在使用SDK的时候受到的熏陶,无意之间自己写也经常会封装。只是可能你并没有把它认识为到模式层面。
Android中,Context就用到来外观模式,像什么startActivity()、sendBroadcast()等等,就是该类提供出来的外观方法。
UML
- Faced : 外观接口,通过该类提供的方法来间接访问子系统
- SysyemA-C: 子系统,涵盖被调用的具体实现
使用场景
- 需要为提供一些子系统提供一个统一接口供外部访问的时候。可以隐藏内部细节,后续不断演化越来越复杂,可以隔离变化。制作APi时候
- 需要构建层次结构的子系统时候,使用Faced定义每个层次人口。如果子系统相互依赖,通过Faced接口进行进行通信,从而简化它们之间依赖(后面这句话同时也代表着中介者模式的场景)
事例
比如你想入职某家公司,但是从哪里开始呢?那就是投建立到该公司邮箱,那么这个投递邮箱入口,就算是开给你用的一个接口咯,然后其内部处理再反馈适不适合进行面试。
- 建立信息投递接口
/**
* 外观模式,公司接口
* 提供email邮箱接口接收信息,返回反馈
* @author shixin
*/
public interface ICompany {
String emailInfoFace(String info);
}
- 公司人事提供被公司调用的方法与公司的实体,公司实体实现接口,对外界提供方法:
/**
* 公司人事
*/
public class CompanyPersonnel {
/**
* 合适
*/
public static final int OK = 1;
/**
* 不合适
*/
public static final int NO_OK = 0;
/**
* 评估是否合适
*
* @param info 信息
* @return 合适和不合适
*/
public int infoEva(String info) {
if (!TextUtils.isEmpty(info) && info.length() > 10) {
return OK;
}
return NO_OK;
}
}
/**
* 公司实现,根据限制来反馈给投简历者
*/
public class CompanyImpl implements ICompany {
private CompanyPersonnel companyPersonnel = new CompanyPersonnel();
/**
* 接收应聘者信息,进入公司内部操作
* @param info
* @return 反馈信息
*/
@Override
public String emailInfoFace(String info) {
//人事部门来评估是否合适
if (companyPersonnel.infoEva(info) == CompanyPersonnel.OK) {
return "您好,请明天来面试";
}
return "对不起,你咱不适合本公司要求";
}
}
- 测试方法:
/**
* 外观模式测试
*/
public class FaceTest {
public static void main(String[] arg) {
ICompany iCompany = new CompanyImpl();
//应聘者投简历
String backInfo = iCompany.emailInfoFace("你好,啦啦啦啦啦啊啦啦啦啦");
System.out.println(backInfo);
}
}
- 输出:
您好,请明天来面试
这样大概就能看到,公司对外暴露了一个接口,其实内部怎么操作对调用者来说是不知道的,这就是外观模式。
优缺点
优点
- 对调用者隐藏了细节,拥抱变化。
- 封装,调用者使用简单。
缺点
- 外观类接口膨胀,子系统接口依靠外观类暴露,所以接口较多,一定程度上增加了用户使用成本。
- 外观类没有遵循开关闭原则,业务出现变更时,需要直接修改外观类。
Android中的AssetManager资源管理初始化注册,Native层的AssetManager注册等。
总结:常用到的模式,只是可能你没有认识到模式而已,当然有了这个认识,会让你比如在制定SDK时更有想法,制作出一个更好的SDK。