利用IDEA的debug带你读懂 装饰模式

利用IDEA的debug带你读懂 装饰模式

假如有这样一个需求:
设计一个电话类,有最基础的打电话的功能。第一个需求是打电话之前播放一段铃声,这时候我们就很自然想到再写一个铃声电话类继承电话类,重写继承自父类的方法。现在又有新需求,打完电话后,还要给出当前的通话时间,而且也要实现第一个需求怎么办?好的,我们还可以使用继承,写一个类继承前面刚实现的铃声电话类……
看起来,设计的难度不大,但是假如我们有更多的需求,那么是不是要继承前面的类。假如我们对其中的一个父类进行了修改,那么实现它的子类都会发生变化,可见,这种设计方式类之间的耦合性是十分高的,那么有没有一种设计模式可以解决这种问题呢?
我们常说设计来源于生活,程序的设计也一样。例如我们去餐厅点餐时,我们选了一种主菜,但是我们还是需要添加其它的配料,我们仔细观察,配料是有很多种的,但是各个配料之间也是相对独立的,我们可以选择加A,B……,配料;另一个人也可以选择B,C,D……配料。主菜和配料也是一同放在了食品这个主操作屏幕上的,那么这个日常生活上的例子有没有为我们的设计提供思路呢?

装饰模式

在这里插入图片描述

一个电话接口

public interface Phone {
    void call();
}

实现电话接口的基本类

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

一个实现了电话接口的装饰器

后面所有的装饰器都是继承这个类

public class phoneDecration implements Phone{
    private Phone phone;

    public phoneDecration(Phone phone) {
        this.phone = phone;
    }

    @Override
    public void call() {
        phone.call();
    }
}

可以播放铃声的装饰器

public class MusicPhoneDecration extends phoneDecration {
    public MusicPhoneDecration(Phone phone) {
        super(phone);
    }
    public void play(){
        System.out.println("放音乐");
    }
    @Override
    public void call() {
        play();
        super.call();
    }
}

可以给出时间的装饰器

public class GiveTimeDecoration extends phoneDecration{
    public GiveTimeDecoration(Phone phone) {
        super(phone);
    }
    public void giveTime(){
        System.out.println("当前时间XX");
    }
    @Override
    public void call() {
        super.call();
        giveTime();
    }
}

测试类

public class test {
    public static void main(String[] args) {
        Phone phone = new iphoneX();
        phone = new MusicPhoneDecration(phone);
        phone = new GiveTimeDecoration(phone);
        phone.call();
    }
}

debug启动

在这里插入图片描述


注意看上图变量的层次结构!!

在这里插入图片描述

在这里插入图片描述

注意看上图,我们在调用phone.call()时候,来到了super.call(),很自然是去调用phoneDecration的call(),注意看我圈起来的!此时要调用的是MusicPhoneDecration的call()方法
在这里插入图片描述

执行完MusicPhoneDecration的play()方法,再去调用MusicPhoneDecration的call方法里面的super.call()方法
在这里插入图片描述

在这里插入图片描述

这时候又来到了phoneDecration这个类,因为MusicPhoneDecration也是继承于这个类的,我们观察这一步的phone变量的类型为iPhoneX这个类
在这里插入图片描述

执行完iPhoneX的call时候,开始返回
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

执行完给出时间这个函数后,整个过程就结束了
在这里插入图片描述

结果

在这里插入图片描述

我们通过装饰模式完成了给定的需求,让一个电话实现了许多功能。而且各个类之间的耦合性大大降低。符合开闭原则,我们可以继续为电话增加新的功能,编写一个功能类继承phoneDecration类即可,我们修改现有的功能不会影响到其它类的现有功能。

第一幅类图图片资料来源:https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247484226&idx=1&sn=a354d872978fc5db79a012c27ab5277f&chksm=ebd74243dca0cb5515fcad1ecfeda6a329be38c30a82a1325a5a19e7f62b0fa3c74069eed24d&scene=21#wechat_redirect(Java3y)

已标记关键词 清除标记
相关推荐
<p> <span style="color:#4d4d4d;">当前课程中博客项目的实战源码是我在 GitHub上开源项目 My-Blog,目前已有 2000 多个 star:</span> </p> <p> <span style="color:#4d4d4d;"><img src="https://img-bss.csdnimg.cn/202103310649344285.png" alt="" /><br /> </span> </p> <p> <span style="color:#4d4d4d;">本课程是一个 Spring Boot 技术栈的实战类课程,课程共分为 3 大部分,前面两个部分为基础环境准备和相关概念介绍,第三个部分是 Spring Boot 个人博客项目功能的讲解,<span style="color:#565656;">通过本课程的学习,不仅仅让你掌握基本的 Spring Boot 开发能力以及 Spring Boot 项目的大部分开发使用场景,同时帮你提前甄别和处理掉将要遇到的技术难点,认真学完这个课程后,你将会对 Spring Boot 有更加深入而全面的了解,同时你也会得到一个大家都在使用的博客系统源码,你可以根据自己的需求和想法进行改造,也可以直接使用它来作为自己的个人网站,这个课程一定会给你来巨大的收获。</span></span> </p> <p> <span style="color:#4d4d4d;"><span style="color:#565656;"> </span></span> </p> <p> <span style="color:#e53333;"><span style="color:#e53333;"><strong>课程特色</strong></span></span> </p> <p> <span style="color:#e53333;"><span style="color:#e53333;"><strong> </strong></span></span> </p> <p> <span style="color:#4d4d4d;"><span style="color:#565656;"> </span></span> </p> <ol> <li> <span style="color:#565656;">课程内容紧贴 Spring Boot 技术栈,涵盖大部分 Spring Boot 使用场景。</span> </li> <li> <span style="color:#565656;">开发教程详细完整、文档资源齐全、实验过程循序渐进简单明了。</span> </li> <li> <span style="color:#565656;">实践项目页面美观且实用,交互效果完美。</span> </li> <li> <span style="color:#565656;">包含从零搭建项目、以及完整的后台管理系统和博客展示系统两个系统的功能开发流程。</span> </li> <li> <span style="color:#565656;">技术栈新颖且知识点丰富,学习后可以提升大家对于知识的理解和掌握,对于提升你的市场竞争力有一定的帮助。</span> </li> </ol> <p> <strong>实战项目预览</strong> </p> <p> <span style="color:#4d4d4d;"><span style="color:#565656;"><span style="color:#e53333;"><strong> </strong></span></span></span> </p> <p> <span style="color:#4d4d4d;"><img src="https://img-bss.csdn.net/202005150303066258.png" alt="" /><br /> </span> </p> <p>   </p> <p> <span style="color:#4d4d4d;"> </span> </p> <p> <span style="color:#4d4d4d;"><img src="https://img-bss.csdn.net/202005150305396930.png" alt="" /><br /> </span> </p> <p> <span style="color:#4d4d4d;"> </span> </p> <p> <span style="color:#4d4d4d;"><img src="https://img-bss.csdn.net/202005150305528842.png" alt="" /><br /> </span> </p> <p> <span style="color:#4d4d4d;"> </span> </p> <p> <span style="color:#4d4d4d;"><img src="https://img-bss.csdn.net/202005150306056323.png" alt="" /><br /> </span> </p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页