文章目录
策略模式
当我们对同一个共性的任务有多种不同的算法。
比如:Doctor和Teacher是接口(interface)People 两种不同的具体实现,此时我们的一个任务需要去计算他们的工资,因为职业的不同,所以这两个具体类计算工资的算法不同,有着不同的"策略",此时我们就可以用策略模式进行设计。
我们可以很自然地想到:我们可以为不同实现算法构造抽象接口,利用delegation,运行时动态的传入client倾向的算法类实例。
我们用计算这一策略进行举例:
public interface calStrategy {
public int calc(int num1,int num2);
}
public class AddStrategy implements calStrategy {
@Override
public int calc(int num1, int num2) {
return num1 + num2;
}
}
public class SubstractStrategy implements calStrategy {
@Override
public int calc(int num1, int num2) {
return num1 - num2;
}
}
在上面我们定义了关于计算的策略接口与具体的实现策略的具体类。
我们可以动态的对我们的策略进行选择,到达自由切换算法的目的,而且具有很好的可扩展性。
在某个具体的类中
public class cal{
public int calculate(calStrategy calMethod){
return calMethod.calc(num1, num2);
}
}
策略模式的设计方法非常直观,容易被我们所接受并在具体的编程中实现。
在这个过程中,我们定义了一系列关于某一问题的不同算法,然后把它们进行封装,让他们可以相互替换,并且算法的变化不会影响到客户,在之后想要增加新的算法也很方便。
但是我们也要注意到它将策略的具体实现类全都暴露给了用户,这有一定的好处,但是也有一定的弊端(毕竟也算是表示泄露)。