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 参数,打印堆中对象,这里不再操作)。
posted @ 2020-11-11 14:29  gxs-standup  阅读(114)  评论(0编辑  收藏  举报