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 参数,打印堆中对象,这里不再操作)。