1.定义
定义一系列的算法,将这些算法分别封装起来并且可以相互替换使用,策略模式让算法独立于客户应用而独立变化。
2.代码示例
a.下面的代码遇到的问题可以用策略设计模式解决
public class Strategy
{
public static void main(String[] args)
{
Move move = new Left();
move.direction();
}
}
abstract class Move
{
public abstract void direction();
}
class Left extends Move
{
public void direction()
{
System.out.println("向左移动");
}
}
class Right extends Move
{
public void direction()
{
System.out.println("向右移动");
}
}
class Front extends Move
{
public void direction()
{
System.out.println("向前移动");
}
}
class Behind extends Move
{
public void direction()
{
System.out.println("向后移动");
}
}
基于上面的代码,将Left、Right、Front、Behind当作客户应用,Left客户应用现在让我们向左移动,我们已经实现了它;但是如果现在Left客户应用要我们向右移动,这时上面的方法就不可取了。我们该怎么办?很明显我们应该让客户应用与客户应用的需求独立开来,这样客户应用要什么需求我给你什么需求。策略设计模式让算法(需求)独立于客户应用而独立变化。策略设计模式怎么去实现?接口+类比对象的多态性。
b.用策略设计模式解决上述问题
public class Strategy
{
public static void main(String[] args)
{
Move move = new Left(new LeftMove());
move.direction();
//现在Left客户应用要求实现向右移动
Move m = new Left(new RightMove());
m.direction();
}
}
//接口
interface MoveAct
{
public void direction();
}
//封装四个需求,与客户应用独立
class LeftMove implements MoveAct
{
public void direction()
{
System.out.println("向左移动");
}
}
class RightMove implements MoveAct
{
public void direction()
{
System.out.println("向右移动");
}
}
class FrontMove implements MoveAct
{
public void direction()
{
System.out.println("向前移动");
}
}
class BehindMove implements MoveAct
{
public void direction()
{
System.out.println("向后移动");
}
}
abstract class Move
{
protected MoveAct moveAct;//接口变量
public abstract void direction();
}
//四个客户应用
class Left extends Move
{
public Left(MoveAct moveAct)
{
this.moveAct = moveAct;
}
public void direction()
{
moveAct.direction();
}
}
class Right extends Move
{
public Right(MoveAct moveAct)
{
this.moveAct = moveAct;
}
public void direction()
{
moveAct.direction();
}
}
class Front extends Move
{
public Front(MoveAct moveAct)
{
this.moveAct = moveAct;
}
public void direction()
{
moveAct.direction();
}
}
class Behind extends Move
{
public Behind(MoveAct moveAct)
{
this.moveAct = moveAct;
}
public void direction()
{
moveAct.direction();
}
}
c.上述代码的优化
//代码优化
//代码虽然优化了,但是有点不符合现实情况
public class Strategy
{
public static void main(String[] args)
{
Move move = new Left();
move.setMoveAct(new LeftMove());
Left left = (Left)move;
left.direction();
//现在Left客户应用要求实现向右移动
move.setMoveAct(new RightMove());
left.direction();
}
}
//接口
interface MoveAct
{
public void direction();
}
//封装四个需求,与客户应用独立
class LeftMove implements MoveAct
{
public void direction()
{
System.out.println("向左移动");
}
}
class RightMove implements MoveAct
{
public void direction()
{
System.out.println("向右移动");
}
}
class FrontMove implements MoveAct
{
public void direction()
{
System.out.println("向前移动");
}
}
class BehindMove implements MoveAct
{
public void direction()
{
System.out.println("向后移动");
}
}
class Move
{
private MoveAct moveAct;//接口变量
public void setMoveAct(MoveAct moveAct)
{
this.moveAct = moveAct;
}
public void direction()
{
moveAct.direction();
}
}
//四个客户应用
class Left extends Move{}
class Right extends Move{}
class Front extends Move{}
class Behind extends Move{}