策略模式定义了算法簇,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
- 将超类A中变化的部分提取出来
- 将这些变化的部分,分别设计接口,即其类B, C, D和子类BB, BBB, CC, CCC, DD, DDD
- 在超类A中使用变量记录
A{
B varb;
C varC;
void getBFunc()
{
B.func();
}
void getCFunc()
{
C.func();
}
}
- 在A的子类中new具体的B和C等接口
AA : A{
AA()
{
varb = new BB;
varc = new CC;
}
}
- A a = new AA;
a.getBFunc();就会调用BB的getBFunc()实例;
- 动态修改实现
在超类中增加setter方法,修改实例化的B,C
A{
void setB(B b)
{
varb = b;
}
}
A a = new AA;
a.getBFunc(); //此处调用构造函数中的BB
a.setB(new BBB);
a.getBFunc(); //此处调用赋值的BBB中的方法
for example:
角色和武器;
- 有很多种游戏角色
- 有许多种武器
- 每个角色只能使用一种武器
- 可以在游戏过程中更换武器
如果说用策略模式实现角色的某种行为,这句话意味着,角色的行为被封装进入一组类中,可以被轻易的扩充和改变,如果需要,甚至在运行时也可以改变行为;比如使用武器,使用武器这个行为会被封装在一组类中,可以扩充为使用各种类型的武器,角色可以在运行时决定使用哪种武器。
为什么要这么做?
- 将变化的部分脱离出超类,那么变化的部分就可以变成算法簇,可以实现一系列的算法
- 在实际使用的类中,根据需要使用某一种算法
- 达到解耦和组合的目的
- 可以动态修改实现
总结:将算法提取出来,实现算法簇
根据实际使用实例化具体的算法
动态修改使用的算法
多用组合,少用继承