《Android源码设计模式》读书笔记 (22) 第22章 外观模式

前言

  • 外观模式是封装API的常用手段.通过一个外观类使得整个系统的接口只有一个统一的高层接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节.

定义

  • 定义:要求一个子系统的外部与内部的通信必须通过一个统一的对象进行.门面模式(Facade模式)提供一个高层次的接口,使得子系统更容易使用
  • 使用场景:
    1.为一个复杂的子系统提供一个简单统一的接口,对外隐藏子系统的具体实现,隔离变化.
    2.当你需要构建一个层次接口的子系统时,使用Facade模式定义子系统中每层的入口点.
  • 优点:
    1.对客户程序隐藏子系统细节,因而减少了客户对于子系统的耦合,能够拥抱变化
    2.外观类对子系统的接口封装,使得系统更易于使用.
  • 缺点:
    1.外观类接口膨胀,在一定程度上增加了用户的使用成本
    2.外观类没有遵循开闭原则,当业务出现变更时,可能需要直接修改外观类.

UML类图

这里写图片描述

  • Facade:系统对外的统一接口,系统内部系统得工作.
  • SystemA,SystemB,SystemC:子系统接口.
    一个统一的接口对外提供服务,使得外部程序只通过一个类就可以实现系统内部的多种功能.

实现案例

  • 这里通过一个模拟手机拨号等业务的案例来表现外观模式.
    1.首先将子类的具体实现写在内部,主要由接口和实现内组成.
/**
 * 打电话接口
 * Created by max on 2016/4/12.
 */
public interface Phone {
    //拨电话
    public void dail();
    //挂断
    public void hangup();
}
/**
 * 拨打电话具体的实现类
 * Created by max on 2016/4/12.
 */
public class PhoneImpl implements Phone{
    @Override
    public void dail() {
        //写具体业务
    }

    @Override
    public void hangup() {
        //写具体业务
    }
}

2.将子类具体的实现,封装在一个统一的对外高层次接口里面,其实也就是用户能调用的类,用户只用调取这个类的方法,就可以实现相关功能了.

/**
 * 手机的相关功能
 * 使用对不同子类引用的相关方法,实现具体的不同业务功能
 * Created by max on 2016/4/12.
 */
public class MobilePhone {
    private Phone mPhone = new PhoneImpl();
    private Cemera mCemera = new SamsungCamera();

    public void dail(){
        mPhone.dail();
    }

    public void videoChat(){
        mCemera.open();
        mPhone.dail();
    }
}

总结

发布了82 篇原创文章 · 获赞 3 · 访问量 7万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章