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 参数,打印堆中对象,这里不再操作)。
  • 相关阅读:
    WCF服务自我寄宿 Windows服务
    客户端调用 WCF 的几种方式
    SQL Server 2005 数据库 可疑状态
    mysql server 自动断开的问题
    mysql数据表简单拷贝及重命名
    Mac提示App已损坏 你应该将它移到废纸篓的解决方案
    Mac系统下安装Tomcat,以及终端出现No such file or directory的错误提示解决方案
    md1
    转-SourceTree注册atlassian账号SIGUP按钮灰色无法注册的问题
    mysql my.cnf优化
  • 原文地址:https://www.cnblogs.com/gxs-future/p/13958512.html
Copyright © 2011-2022 走看看