策略模式:定义了算法簇,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
使用到的设计原则:
#1. 找出应用中可能需要变化之处,把它独立出来,不要和那些不需要变化的代码混在一起。
#2. 针对接口编程,而不是针对实现编程。
#3. 多用组合,少用继承。
举例:head first设计模式中的鸭子例子
代码:
Duck.java
package proj.wxh.duck; /** * 鸭子基类 */ public abstract class Duck { // 引用实现QuackBehavior接口的对象 QuackBehavior quackBehavior; // 同上 FlyBehavior flyBehavior; // 委托给quackBehavior引用的对象处理 public void performQuack(){ quackBehavior.quack(); } // 同上 public void performFly(){ flyBehavior.fly(); } // 添加动态设定行为,随时改变动物行为 public void setQuackBehavior(QuackBehavior quackBehavior) { this.quackBehavior = quackBehavior; } public void setFlyBehavior(FlyBehavior flyBehavior) { this.flyBehavior = flyBehavior; }
public void swim(){ System.out.println("All Ducks Float, Even Decoys"); } }
|
FlyBehavior.java
package proj.wxh.duck;
public interface FlyBehavior { /** * 飞行行为 */ public void fly(); }
|
FlyNoWay.java
package proj.wxh.duck;
public class FlyNoWay implements FlyBehavior {
@Override public void fly() { System.out.println("鸭子不会飞"); }
}
|
FlyWithWings.java
package proj.wxh.duck;
public class FlyWithWings implements FlyBehavior{
@Override public void fly() { System.out.println("鸭子飞行"); } }
|
QuackBehavior.java
package proj.wxh.duck;
public interface QuackBehavior { /** * 尖叫行为 */ public void quack(); }
|
Quack.java
package proj.wxh.duck;
public class Quack implements QuackBehavior {
@Override public void quack() { System.out.println("鸭子呱呱叫"); }
}
|
Squeak.java
package proj.wxh.duck;
public class Squeak implements QuackBehavior {
@Override public void quack() { System.out.println("鸭子吱吱叫"); }
}
|
MallardDuck.java
package proj.wxh.duck;
public class MallardDuck extends Duck { public MallardDuck() { // 创建Quack类实例,委托给quack对象 quackBehavior由基类继承来的 quackBehavior=new Quack(); // 同上 flyBehavior=new FlyWithWings(); }
public void display(){ System.out.println("I am a real Mallard Duck"); } }
|
MallardDuck.java
package proj.wxh.duck;
public class MallardDuck extends Duck { public MallardDuck() { // 创建Quack类实例,委托给quack对象 quackBehavior由基类继承来的 quackBehavior=new Quack(); // 同上 flyBehavior=new FlyWithWings(); }
public void display(){ System.out.println("I am a real Mallard Duck"); } }
|
参考自<<head first设计模式>>