简述-外观模式

介绍

外观模式,提供一个统一的接口供使用者访问,隐蔽内部实现,制作API必备。应该每一个开发者都会使用到,因为你在使用SDK的时候受到的熏陶,无意之间自己写也经常会封装。只是可能你并没有把它认识为到模式层面。

Android中,Context就用到来外观模式,像什么startActivity()、sendBroadcast()等等,就是该类提供出来的外观方法。

UML

简述-外观模式_第1张图片

  • Faced : 外观接口,通过该类提供的方法来间接访问子系统
  • SysyemA-C: 子系统,涵盖被调用的具体实现

使用场景

  • 需要为提供一些子系统提供一个统一接口供外部访问的时候。可以隐藏内部细节,后续不断演化越来越复杂,可以隔离变化。制作APi时候
  • 需要构建层次结构的子系统时候,使用Faced定义每个层次人口。如果子系统相互依赖,通过Faced接口进行进行通信,从而简化它们之间依赖(后面这句话同时也代表着中介者模式的场景)

事例

比如你想入职某家公司,但是从哪里开始呢?那就是投建立到该公司邮箱,那么这个投递邮箱入口,就算是开给你用的一个接口咯,然后其内部处理再反馈适不适合进行面试。

  1. 建立信息投递接口
/**
 * 外观模式,公司接口
 * 提供email邮箱接口接收信息,返回反馈
 * @author shixin
 */
public interface ICompany {
    String emailInfoFace(String info);
}
  1. 公司人事提供被公司调用的方法与公司的实体,公司实体实现接口,对外界提供方法:
/**
 * 公司人事
 */
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 "对不起,你咱不适合本公司要求";
    }
}
  1. 测试方法:
/**
 * 外观模式测试
 */
public class FaceTest {

    public static void main(String[] arg) {
        ICompany iCompany = new CompanyImpl();
        //应聘者投简历
        String backInfo = iCompany.emailInfoFace("你好,啦啦啦啦啦啊啦啦啦啦");
        System.out.println(backInfo);
    }
}
  1. 输出:
您好,请明天来面试

这样大概就能看到,公司对外暴露了一个接口,其实内部怎么操作对调用者来说是不知道的,这就是外观模式。

优缺点

优点

  • 对调用者隐藏了细节,拥抱变化。
  • 封装,调用者使用简单。

缺点

  • 外观类接口膨胀,子系统接口依靠外观类暴露,所以接口较多,一定程度上增加了用户使用成本。
  • 外观类没有遵循开关闭原则,业务出现变更时,需要直接修改外观类。

Android中的AssetManager资源管理初始化注册,Native层的AssetManager注册等。

总结:常用到的模式,只是可能你没有认识到模式而已,当然有了这个认识,会让你比如在制定SDK时更有想法,制作出一个更好的SDK。

你可能感兴趣的:(设计模式)