1:所谓策略模式就是把算法定义的一组算法封装,把调用与实现分开,在客户端(测试类)中调用它们的时候相互之间不发生影响。它的基础就是多态。
2:策略模式的意义:
策略模式提供了许多可替换的部分组成的软件,并且各个部分之间是弱连接的关系。
弱连接的特性使软件具有更强的可扩展性,易于维护;更重要的是,它大大提高了软件的可重用性。
3:策略模式的组成:
2:具体的策略角色,实现上面的接口,定义要实现的方法;
3:环境角色,环境角色中拥有一个抽象策略角色的引用;
4:客户端(测试类),生成具体策略角色与环境角色的对象。
好吧,也许上面说的太含蓄了,其实就是把1定义为一个接口,然后2为实现了接口的n个类,3的话就是定义一个1的引用,用1的引用在被赋予意义后调用2中的若干个方法,然后4嘛,就是生成一个2(其实是2中某个类的)和3的对象,就行了。
4:具体实现:
实现一个加减乘除的方法。
1:抽象的策略角色
package com.sunyonggang;
publicinterfaceStrategy //抽象角色
{
int calcu(int i, int j);
}
2:具体的策略角色
package com.sunyonggang;
publicclassAddStrategy implements Strategy //实现加法的角色
{
publicint calcu(int i, int j)
{
return i+j;
}
}
package com.sunyonggang;
publicclassSubstractStrategy implements Strategy //实现减法的角色
{
publicint calcu(int i, int j)
{
return i-j;
}
}
package com.sunyonggang;
publicclassMultiplyStrategy implements Strategy //实现乘法的角色
{
publicint calcu(int i, int j)
{
return i*j;
}
}
package com.sunyonggang;
publicclassDivideStrategy implements Strategy //实现除法的角色
{
publicint calcu(int i, int j)
{
if(j == 0)return 0; //如果j=0,那么就返回0;
return i/j;
}
}
3:环境角色
package com.sunyonggang;
publicclassEnvironmentStrategy //环境角色
{
private Strategy strategy;
publicEnvironmentStrategy(Strategy s)
{
strategy = s;
}
public Strategy getStrategy()
{
returnstrategy;
}
publicvoid setStrategy(Strategystrategy)
{
this.strategy = strategy;
}
publicint what(int i, int j)
{
returnstrategy.calcu(i, j);
}
}
4:客户端(测试类)
package com.sunyonggang;
publicclassStrategyTest //测试类
{
publicstaticvoid main(String[] args)
{
int i = 3;
int j = 4;
Strategys = newAddStrategy(); //计算i+j的和
EnvironmentStrategye = newEnvironmentStrategy(s);
System.out.println(e.what(i, j));
Strategys2 = newSubstractStrategy(); //计算i+j的差
e.setStrategy(s2);
System.out.println(e.what(i, j));
Strategys3 = newMultiplyStrategy(); //计算i+j的积
e.setStrategy(s3);
System.out.println(e.what(i, j));
Strategys4 = newDivideStrategy(); //计算i+j的商
e.setStrategy(s4);
System.out.println(e.what(i, j));
}
}
5策略模式的缺点:
1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
2.造成很多的策略类。
6参考资料
北京圣思圆javaSE第51讲;
Csdn博客:http://blog.csdn.net/surprisesdu/article/details/636951。