zoukankan      html  css  js  c++  java
  • java 装饰者模式 内存模型分析

    参考文章链接:

    https://my.oschina.net/u/3777556/blog/1808718

    自己做的dmo:

    接口:

    (常量)基础实现类:

     起着承上启下作用的抽象类:

     扩展类1:

     扩展类2:

     

     打印结果:

    好了,开始说下我的疑惑和内存分析:

    1,iphone 连续指向3个堆内存地址,前面两个对象还会存在吗?

    2,打印结果预期的是 音乐类应该会打印两次,可是这样基础功能都实现不了,应该也不会成为一种设计模式。

    最近在看java 内存区域,也顺手画了下,可以看下:

     堆栈结合代码分析:

        iphone 引用依次指向1,2,3,当指针指向2时,PhoneMusic 继承的父类

    IPhoneDecorate 变量 iPhone
    指向 new Iphone() 内存地址,
    当指针为3时,
    PhoneCurrentTime 父类
    IPhoneDecorate 变量 iPhone
    指向 new PhoneMusic() 内存地址;
    1)当执行 iPhone.call()方法中代码 super.call();
    执行 PhoneCurrentTime 父类 IPhoneDecorate.call() ,
    IPhoneDecorate 变量 iPhone,指向PhoneMusic 实例堆内存,
    iPhone.call() 实际是 PhoneMusic.call();
    2) 执行 PhoneMusic.call() 方法,
    listenMusic(); 调用本实例添加功能方法,
    super.call(); 会继续执行父类方法 IPhoneDecorate.call() ,
    类中变量 iPhone 指向实例 IPhoneX ,
    当执行 iPhone.call()方法中代码 IPhoneX.call();
    至此,向上调用结束;
    3) PhoneCurrentTime.call() 继续执行 currentTime(),
    执行本类添加的功能方法;
    至此,分析完毕;
    个人理解:
    装饰者模式 基础功能不变,继承抽象类添加功能,进行基础功能修饰,功能有先后顺序;
    iphone 引用对象指向,当指向下一个对象时,先把本次引用值赋给堆中对象时,然后栈中指针才会重新指向该实例;
    堆实例对象 PhoneMusic ,IPhoneX 不会随着没有指针指向而被垃圾回收,它们都被接下来的对象属性所引用(当然也可以设置jvm 参数,打印堆中对象,这里不再操作)。
  • 相关阅读:
    Notes about "Exploring Expect"
    Reuse Sonar Checkstyle Violation Report for Custom Data Analysis
    Eclipse带参数调试的方法
    MIT Scheme Development on Ubuntu
    Manage Historical Snapshots in Sonarqube
    U盘自动弹出脚本
    hg的常用配置
    Java程序员的推荐阅读书籍
    使用shared memory 计算矩阵乘法 (其实并没有加速多少)
    CUDA 笔记
  • 原文地址:https://www.cnblogs.com/gxs-future/p/13958512.html
Copyright © 2011-2022 走看看