定义:策略模式定义了算法族(每个行为的实现都是算法,合起来就是算法族),分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
设计原则:
1、找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要的变化的代码混在一起
2、针对接口编程,而不是针对实现编程(利用多态)
3、多用组合,少用继承
每一个鸭子都有一个FlyBehavior和QuackBehavior,可以将飞行和呱呱叫的行为都委托给它们处理。
当两个类结合起来使用,就是组合。这种和继承的不同在于,鸭子的行为不是继承来的,而是和适当的行为对象“组合”来的。
Duck类:
Duck.java
package com.sun;
public abstract class Duck {
/*
* 下面两个类属于变化的部分
*/
//飞的类
FlyBehavior flyBehavior;
//叫的类
QuackBehavior quackBehavior;
public Duck(){
}
public abstract void display();
public void performFly(){
//委托给行为类
flyBehavior.fly();
}
public void performQuack(){
//委托给行为类
quackBehavior.quack();
}
/*
* 增加另个新方法,实现动态设定行为
*/
public void setFlyBehavior(FlyBehavior fb){
//会通过接口(多态的表现形式之一)行为改变为相应的飞行行为(调用相应行为的方法)
flyBehavior = fb;
}
public void setQuackBehavior(QuackBehavior qb){
quackBehavior = qb;
}
public void swim(){
System.out.println("All ducks float,even decoys!");
}
}
MallardDuck类:
package com.sun;
public class MallardDuck extends Duck{
public MallardDuck(){
//是对MallardDuck的具体实现
quackBehavior = new Quack();
flyBehavior = new FlywithWings();
}
public void display(){
System.out.println("I'm a real Mallard duck");
}
}
ModelDuck类:
package com.sun;
public class ModelDuck extends Duck {
public ModelDuck(){
//通过具体实现测试,静态设定行为
flyBehavior = new FlyNoWay();
quackBehavior = new Quack();
}
public void display() {
System.out.println("I'm a model duck");
}
}
飞的行为接口
package com.sun;
/*
* 飞的行为类
*/
public interface FlyBehavior {
public void fly();
}
以下是飞的接口的三个实现类:
package com.sun;
public class FlyNoWay implements FlyBehavior {
public void fly() {
System.out.println("i can't fly!!");
}
}
package com.sun;
public class FlyRocketPowered implements FlyBehavior {
public void fly() {
System.out.println("I'm fly with a rocket!");
}
}
package com.sun;
public class FlywithWings implements FlyBehavior {
public void fly() {
System.out.println("I'm flying!!");
}
}
QuackBehavior行为的接口:
package com.sun;
/*
* 叫的行为类
*/
public interface QuackBehavior {
public void quack();
}
以下是QuackBehavior接口的实现类:
package com.sun;
public class Quack implements QuackBehavior {
public void quack() {
System.out.println("quack!!");
}
}
package com.sun;
public class Squeak implements QuackBehavior {
public void quack() {
System.out.println("quack");
}
}
package com.sun;
public class MuteQuack implements QuackBehavior {
public void quack() {
System.out.println("<<>silence>");
}
}
测试类:
package com.sun;
/*
* 测试类
*/
public class MiniDuckSimulator {
public static void main(String[] args) {
//静态设定行为
Duck mallard = new MallardDuck();
mallard.performQuack();
mallard.performFly();
/*
动态设定行为,通过在Duck中增加两个set方法
在运行时想改变鸭子的行为,只需调用鸭子的setter方法就可以
*/
Duck model = new ModelDuck();
model.performFly();
model.setFlyBehavior(new FlyRocketPowered());
model.performFly();
}
}