策略模式
(Strategy Pattern):将算法的使用
从算法的实现中分离出来
,从而让算法的变化不会影响
到使用算法的用户
。
通常涉及三个角色
:
1.上下文
(Context):持有策略接口的引用,并在运行时根据需要更换具体的策略实现
2.策略接口
(Strategy):定义了所有可能的算法实现应该遵循的协议
3.具体策略实现
(Concrete Strategy):实现则实现了这些协议,并为特定的算法提供具体的实现
优点
1.算法的变化不会影响到客户端。
2.可以轻松地切换不同的算法。
3.可以动态地选择不同的算法。
缺点
1.客户端必须知道所有的策略类,至少是它们的接口。
2.可能会增加系统中的类的数量。
应用场景
当一个系统需要多种算法变体时。
当这些算法相互之间是等价的,且可以互换时。
当算法可能发生变化,且变化不应影响到使用算法的客户端时。
示例
:FlyStrategy 是策略接口,FlyWithWings 和 FlyNoWay 是具体策略类,Duck 是上下文类,客户端通过创建不同策略的 Duck 对象来模拟不同鸭子的飞行行为
//策略接口
public interface FlyStrategy {
void fly();
}
//具体策略类
public class FlyWithWings implements FlyStrategy{
@Override
public void fly() {
System.out.println("The duck is flying with its wings.");
}
}
// 具体策略类
public class FlyNoWay implements FlyStrategy{
@Override
public void fly() {
System.out.println("The duck cannot fly");
}
}
//上下文
public class Duck {
private FlyStrategy flyStrategy;
public Duck(FlyStrategy flyStrategy) {
this.flyStrategy = flyStrategy;
}
public void performFly(){
flyStrategy.fly();
}
}
//客户端
public class Client {
public static void main(String[] args) {
Duck mallardDuck=new Duck(new FlyWithWings());
mallardDuck.performFly();
Duck rubberDuck=new Duck(new FlyNoWay());
rubberDuck.performFly();
}
}