问题来自HeadFirst设计模式第11章代理模式468页的设计谜题:
ImageProxy类似乎有两个有条件语句控制的状态,你能否用另一个设计模式清理这样的代码?你要如何重新设计ImageProxy?
思路:
我们可以使用状态模式:实现两个状态,分别是ImageLoaded和ImageUnloaded。然后把if语句内的代码放进去各自的状态中。一开始的状态是ImageLoaded,当ImageIcon取回后就转换道ImageLoaded状态。
下面是自己写的一段参考代码
State类
扩展Icon接口,只是单纯的改个接口名字方便理解
Icon是JavaAPI的内置接口,负责处理图片。
1 2 3 4 5 |
|
ImageUnloaded类
如果图片未加载,调用该类。
先打印一行字“Loading CD Cover, please wait...”提醒用户等待。
接着开启新线程加载图片,并修改ImageProxyState的状态为ImageLoaded。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
|
ImageLoaded类
如果图片已经加载了,那么调用该类加载图片
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
ImageProxyState
Icon的代理类。有两个State状态 imageLoaded和 imageUnloaded。
当调用它的方法时,会委托给它当前状态处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
|
ImageProxyStateTestDrive
建立框架和菜单并测试代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
|