作者leondemon (狗狗)
看板OOAD
标题Re: [请教] 请教strategy、state pattern in C++
时间Sat Apr 23 17:40:45 2011
我不懂C++ 也看不太懂你的问题
但是如果一个庞大的class内部有许多需求需要改变的时候 一般会用下面作法:
原本状态:有一个物件叫做Computer
他有9种方法(method1-method9)以及5种实体变数(ivar1-ivar5)
用pseudo-code表示:
class Computer:
@attribute(public) ivar1 //为public的attribute
@attribute(public) ivar2
@attribute(public) ivar3
@attribute(private) ivar4 //为private的attribute
@attribute(private) ivar5
-method1 #public > block1 //表示method1内部使用block1的演算法逻辑 以下类推
-method2 #public > block2
-method3 #public > block3
-method4 #public > block4
-method5 #public > block5
-method6 #public > block6
-method7 #public > block7
-method8 #public > block8
-method9 #public > block9
end
通常我遇到这麽大的class我第一步都是在class前方先写注解
来叙述这个物件的responsiblity
现在你希望你维持同样的public interface给使用这个类别的人使用 又有改变的需求
假设method4-method6和method7-method9都有改变需求但改变动机和时机不同
作法会变成宣告两个新的Helper物件:
class HelperA:
-method4 #public > block4
-method5 #public > block5
-method6 #public > block6
end
class HelperB:
-method7 #public > block7
-method8 #public > block8
-method9 #public > block9
end
class Computer:
@attribute(public) ivar1
@attribute(public) ivar2
@attribute(public) ivar3
@attribute(priavte) ivar4
@attribute(private) ivar5
@attribute(private) HelperA instanceOfHelperA
@attribute(private) HelperB instanceOfHelperB
-method1 #public > block1
-method2 #public > block2
-method3 #public > block3
-method4 #public >
instanceOfHelperA.method4
-method5 #public >
instanceOfHelperA.method5
-method6 #public >
instanceOfHelperA.method6
-method7 #public >
instanceOfHelperB.method7
-method8 #public >
instanceOfHelperB.method8
-method9 #public >
instanceOfHelperB.method9
end
但是因为HelperA和HelperB都需要Computer的ivar3-ivar5的资料
於是必须多一个wrapper来当物件之间的传递:
class DataWrapper:
@attribute(public) ivar3
@attribute(public) ivar4
@attribute(public) ivar5
end
clas
@attribute(public) ivar1
@attribute(public) ivar2
@attribute(public) ivar3 > instanceOfDataWrapper.ivar3
@attribute(private) ivar4 > instanceOfDataWrapper.ivar4
@attribute(private) ivar5 > instanceOfDataWrapper.ivar5
@attribute(private) DataWrapper instanceOfDataWrapper
@attribute(private) HelperA instanceOfHelperA
@attribute(private) HelperB instanceOfHelperB
-method1 #public > block1
-method2 #public > block2
-method3 #public > block3
-method4 #public > instanceOfHelperA.method4(instanceOfDataWrapper)
-method5 #public > instanceOfHelperA.method5(instanceOfDataWrapper)
-method6 #public > instanceOfHelperA.method6(instanceOfDataWrapper)
-method7 #public > instanceOfHelperB.method7(instanceOfDataWrapper)
-method8 #public > instanceOfHelperB.method8(instanceOfDataWrapper)
-method9 #public > instanceOfHelperB.method9(instanceOfDataWrapper)
end
当然HelperA和HelperB的method所吃的参数也要改变
class HelperA
-method4
(DataWrapper) #public > block4
-method5
(DataWrapper) #public > block5
-method6
(DataWrapper) #public > block6
end
class HelperB
-method7
(DataWrapper) #public > block7
-method8
(DataWrapper) #public > block8
-method9
(DataWrapper) #public > block9
end
现在你就可以subclass HelperA和HelperB来解决庞大Computer要改变的问题
不知道有没有解决你的问题
--
看一下你的问题 你应该只需要一个private的data wrapper当参数传送就可以解决
(如果你只需要知道原本物件的data的话)
不然我上面的例子HelperA和HelperB就必须知道Computer的存在
而且那些会用到的attribute必须是public
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.80.73.25
1F:推 iamstudent :就是不希望都写成public呀 04/23 17:50
2F:→ leondemon :所以 我这篇讲的不是你要的吗? 04/23 17:55
※ 编辑: leondemon 来自: 111.80.73.25 (04/23 17:57)
3F:推 iamstudent :的确不是,这样那个大class的内容整个都暴露出来了 04/23 17:57
4F:→ leondemon :抽出来之後的public介面还是跟原本的一样 04/23 17:57
5F:→ iamstudent :你例子里面的Computer,我希望他所有attr都是private 04/23 17:58
6F:→ iamstudent :然後只有你的Helper或是DateWrapper可以存取 04/23 18:00
7F:→ iamstudent :因为其他的class或是client都可以使用Computer 04/23 18:00
8F:→ iamstudent :只让有关的类别可以存取就好,其他人只应该持有 04/23 18:01
9F:→ leondemon :Helper和DataWrapper都是private这样不行吗? 04/23 18:18
10F:推 iamstudent :就我目前的case,那个Helper一定会是private没有问题 04/23 18:25
11F:→ iamstudent :问题是那个DataWrapper,他几乎会整个等於大class 04/23 18:26
12F:推 iamstudent :不过我好像有点想法了,也许就整个成员抽出去 04/23 18:30
13F:→ iamstudent :我在想,如果把资源物件改放在Helper的super类别... 04/23 18:32