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 参数,打印堆中对象,这里不再操作)。
  • 相关阅读:
    String类之indexOf--->查找某字对应的位置
    5、文件过滤器
    String类之endsWith方法--->检测该字符串以xx为结尾
    for循环
    java-成员方法/变量、类方法/变量等区别
    4、File类之获取方法
    3、File类之创建、删除、重命名、判断方法
    2、创建File类对象
    Java 实现Redis客户端,服务端
    Phoenix踩坑填坑记录
  • 原文地址:https://www.cnblogs.com/gxs-future/p/13958512.html
Copyright © 2011-2022 走看看