★策略模式中体现了两个非常基本的面向对象设计的原则:
--封装变化的概念
--编程中使用接口,而不是对接口的实现
★面向接口的编程,实现类之间的弱耦合
★策略模式的定义
--定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。
--策略模式使这些算法在客户端调用它们的时候能够互不影响变化。
★策略模式的组成
--抽象策略角色:策略类,通常由一个接口或者抽象类实现
--具体角色:包装了相关的算法和行为。
--环境角色:持有一个策略类的引用,最终给客户端调用。
★策略模式的实现:
--策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。
--策略模式使得算法可以在不影响到客户端的情况下发生变化。使用策略模式可以把行为和环境分割开来。
--环境类负责维持和查询行为类,各种算法则在具体策略中提供。由于算法和环境独立开来,算法的修改都不会影响环境和客户端。
★策略模式的缺点
1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类
2.造成很多的策略类。
★解决方案—采用工厂方法。
抽象策略角色
public interface AbstractStrategy
{
public int calculate(int a , int b);
}
具体角色
public class AddStrategy implements AbstractStrategy
{
public int calculate(int a, int b)
{
return a + b;
}
}
public class DevideStrategy implements AbstractStrategy
{
public int calculate(int a, int b)
{
return a / b ;
}
}
public class MutipleStrategy implements AbstractStrategy
{
public int calculate(int a, int b)
{
return a * b;
}
}
public class SubtractStrategy implements AbstractStrategy
{
public int calculate(int a, int b)
{
return a - b;
}
}
环境角色
public class Enviorment
{
private AbstractStrategy strategy;
public Enviorment(AbstractStrategy strategy)
{
this.strategy = strategy;
}
public AbstractStrategy getStrategy()
{
return strategy;
}
public void setStrategy(AbstractStrategy strategy)
{
this.strategy = strategy;
}
public int calculate(int a , int b)
{
return strategy.calculate(a, b);
}
}