《Android源码设计模式解析与实战》读书笔记(二十三)——外观模式

外观模式(Fcade)在开发过程中使用频率非常高,可能在开发中已经运用了无数次外观模式,只是没有在理论层次认识它,这句话也是我看这本书最大的体会,就是不看不知道,一看才知道我们平时用到的代码,其实里面已经包含了很精妙的设计模式。外观模式是封装 API 的一种常用手段,在第三方 SDK 中一般都使用了外观模式,通过一个外观类可以使整个系统的接口一个只有一个统一的高层接口,降低用户使用成本,也屏蔽了很多内部实现细节。


第二十三章 统一编程接口——外观模式

1.定义

要求一个子系统的外部与其内部通信必须通过一个统一的对象进行,外观类提供一个高层次的接口,使子系统更易于使用。

2.使用场景

1).需要为一个复杂子系统提供一个简单接口,需要隐藏子系统的具体实现、隔离变化时。
2).需要构建一个层次结构的子系统时。如果子系统之间是相互依赖的,可以让子系统仅通过外观类的接口进行通信,简化依赖关系。

3.简单实现

外观模式比较简单,只有两类角色:
外观类:系统对外的统一接口,负责系统内部系统的工作,持有各子系统的对象。
子系统类:负责不同子系统的具体实现。

其实手机系统就可以看作是外观模式,因为现在的手机已经不单单是打电话的功能了,还能拍照,玩游戏等等等等,这些拨号系统、相机系统、游戏系统我们就可以看作是手机系统的子系统,而它们所有的调度都是通过手机系统来调度的。
各个子系统的接口及实现类:
public interface ICamera {
    void focus();

    void takePhoto();

    void save();
}

public class ICameraImpl implements ICamera {
    @Override
    public void focus() {
        System.out.println("聚焦");
    }

    @Override
    public void takePhoto() {
        System.out.println("按下快门,拍照");
    }

    @Override
    public void save() {
        System.out.println("保存照片");
    }
}

public interface IGame {
    void read();

    void play();

    void save();

    void exit();
}

public class IGameImpl implements IGame {

    @Override
    public void read() {
        System.out.println("读取进度");
    }

    @Override
    public void play() {
        System.out.println("开始游戏");
    }

    @Override
    public void save() {
        System.out.println("保存进度");
    }

    @Override
    public void exit() {
        System.out.println("退出游戏");
    }
}

public interface IPhone {
    void enterNumber();

    void dial();

    void hangup();
}

public class IPhoneImpl implements IPhone {
    @Override
    public void enterNumber() {
        System.out.println("输入号码");
    }

    @Override
    public void dial() {
        System.out.println("拨号");
    }

    @Override
    public void hangup() {
        System.out.println("挂断");
    }
}

手机系统:
public class MobilePhone {
    private IPhone mIPhone = new IPhoneImpl();
    private ICamera mICamera = new ICameraImpl();
    private IGame mIGame = new IGameImpl();

    public void dial() {
        mIPhone.enterNumber();
        mIPhone.dial();
    }

    public void hangup() {
        mIPhone.hangup();
    }

    public void takePhoto() {
        mICamera.focus();
        mICamera.takePhoto();
        mICamera.save();
    }

    public void playGame() {
        mIGame.read();
        mIGame.play();
    }

    public void exitGame() {
        mIGame.save();
        mIGame.exit();
    }
}

客户端调用:
        MobilePhone mMobilePhone = new MobilePhone();
        mMobilePhone.dial();
        mMobilePhone.hangup();

        mMobilePhone.takePhoto();

        mMobilePhone.playGame();
        mMobilePhone.exitGame();

运行程序,打印结果如下:

无论我们是拨号、挂电话、拍照还是玩游戏,手机系统都统一封装了各子系统的逻辑封装起来了,所以客户端调用的都是手机系统的方法,然后手机系统内部如何实现,客户端并不知道,所以具体的子系统无论怎么变化,客户端不会知道。

4.总结

外观模式是一个高频率使用的设计模式,它的精髓就在于封装二字。通过一个高层次结构为用户提供一个统一的 API 入口,使用户通过一个类就能操作整个系统,也不会知道内部实现,降低用户使用成本,提供系统灵活性。
优点:
1).对客户端隐藏子系统细节,减少客户端与子系统的耦合。
2).外观类对子系统进行接口封装,使系统更易使用。
缺点:
1).外观类接口较多。
2).外观类没有遵循开闭原则,但子系统具体实现改变时,可能需要修改外观类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值