设计模式: 外观模式(facade)- 概念、实现

学习设计模式不光要学习设计模式的思想,还要去深入理解,为什么要用这个设计模式。
如何深入理解?读优秀的框架代码,看别人代码,了解它们的使用场景。 - - - 博主老师(感谢他)

本文先介绍了外观模式的概念及简单实现。最后总结了一点点思考。外观模式比较简单,使用场景也比较清晰,就不找开源实现了。

1、概念

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

说白了就是如果我们系统需要被外部调用到,我们这应该提供一个统一的接口,对各种方法进行封装。

举个例子:手机有打电话和拍照的功能。用户想调用拍照功能的时候,只需要手机.拍照(),而不需要相机.拍照()。拍照、通话这些功能都聚合在手机这个对象中。而手机这个类本身不实现任何功能,只是负责调用和管理各种子系统(通话系统、拍照系统)

2、实现

实现上面的例子:

先定义一个相机

public interface Camera {

    void open();

    void takePicture();
}
public class CameraImpl implements Camera {
    @Override
    public void open() {
        System.out.println("打开相机");
    }

    @Override
    public void takePicture() {
        System.out.println("拍照");
    }
}

定义一个phone

public interface Phone {
    void dail();
}
public class PhoneImpl implements Phone {
    @Override
    public void dail() {
        System.out.println("打电话");
    }
}

定义一个手机(提供给外部调用的)

public class MobilePhone {

    private Phone phone = new PhoneImpl();
    private Camera camera = new CameraImpl();

    public void takePicture() {
        System.out.println("即将执行拍照--");
        camera.open();
        camera.takePicture();;
    }

    public void videoChat() {
        System.out.println("即将开始视频通话--");
        camera.open();
        phone.dail();
    }
}

测试

public static void main(String[] args) {
    MobilePhone mobilePhone = new MobilePhone();
    mobilePhone.takePicture();
    mobilePhone.videoChat();
}

输出

即将执行拍照--
打开相机
拍照
即将开始视频通话--
打开相机
打电话

3、总结:

外观模式比较简单,就不找开源代码中的典型实现了。我们需要把握住两点:

  1. 需要对外提供一些能力(分不同子系统)
  2. 外观类本身不实现具体的逻辑,只去管理和调用子系统

外观模式遵循了迪米特原则(最少知识原则):一个对象应该对其他对象有最少的了解。
调用方不需要了解我们子系统的实现,只要调我们提供的facade接口就行了。

外观模式违背了开闭原则:软件中的对象(类、模块、函数等)应该对于扩展是开放的,但是,对于修改是封闭的。
不过这个代价是可以接受的~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值