Java设计模式——策略设计模式——接口的运用

来源:互联网 发布:淘宝的一元拍卖骗局 编辑:程序博客网 时间:2024/06/06 14:16

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{}







0 0
原创粉丝点击