策略设计模式
定义
定义一个算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户
策略模式模拟(Head First 设计模式例子)
类的 UML 图
源代码
Duck(抽象类)
package xyz.snowflake.strategy.book;
/**
* @author snowflake
* @email 278121951@qq.com
* @create-date 2019-08-10 13:49
*/
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
public abstract void display();
public void performFly() {
flyBehavior.fly();
}
public void performQuack() {
quackBehavior.quack();
}
public void swim() {
System.out.println("所有的鸭子都会游泳,甚至模型鸭");
}
}
MallardDuck(Duck的子类)
package xyz.snowflake.strategy.book;
/**
* @author snowflake
* @email 278121951@qq.com
* @create-date 2019-08-10 14:26
*/
public class MallardDuck extends Duck {
public MallardDuck() {
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
@Override
public void display() {
System.out.println("我是一只绿头鸭");
}
}
ModeDuck(Duck的子类)
package xyz.snowflake.strategy.book;
/**
* @author snowflake
* @email 278121951@qq.com
* @create-date 2019-08-10 13:55
*/
public class ModeDuck extends Duck {
public ModeDuck() {
flyBehavior = new FlyNoWay();
quackBehavior = new MuteQuack();
}
@Override
public void display() {
System.out.println("我是一只模型鸭");
}
}
FlyBehavior(飞行行为接口)
package xyz.snowflake.strategy.book;
/**
* @author snowflake
* @email 278121951@qq.com
* @create-date 2019-08-10 13:51
*/
public interface FlyBehavior {
void fly();
}
FlyNoWay(FlyBehavior的实现类)
package xyz.snowflake.strategy.book;
/**
* @author snowflake
* @email 278121951@qq.com
* @create-date 2019-08-10 13:56
*/
public class FlyNoWay implements FlyBehavior {
@Override
public void fly() {
System.out.println("不能飞");
}
}
FlyRocketPowered (FlyBehavior的实现类)
package xyz.snowflake.strategy.book;
/**
* @author snowflake
* @email 278121951@qq.com
* @create-date 2019-08-10 14:32
*/
public class FlyRocketPowered implements FlyBehavior {
@Override
public void fly() {
System.out.println("坐火箭飞");
}
}
FlyWithWings
package xyz.snowflake.strategy.book;
/**
* @author snowflake
* @email 278121951@qq.com
* @create-date 2019-08-10 13:55
*/
public class FlyWithWings implements FlyBehavior {
@Override
public void fly() {
System.out.println("用翅膀飞");
}
}
QuackBehavior(鸣叫行为)
package xyz.snowflake.strategy.book;
/**
* @author snowflake
* @email 278121951@qq.com
* @create-date 2019-08-10 13:52
*/
public interface QuackBehavior {
void quack();
}
MuteQuack (QuackBehavior 的行为)
package xyz.snowflake.strategy.book;
/**
* @author snowflake
* @email 278121951@qq.com
* @create-date 2019-08-10 13:57
*/
public class MuteQuack implements QuackBehavior {
@Override
public void quack() {
System.out.println("不叫");
}
}
Squeak (QuackBehavior的实现类)
package xyz.snowflake.strategy.book;
/**
* @author snowflake
* @email 278121951@qq.com
* @create-date 2019-08-10 14:29
*/
public class Squeak implements QuackBehavior {
@Override
public void quack() {
System.out.println("吱吱");
}
}
Quack (QuackBehavior的实现类)
package xyz.snowflake.strategy.book;
/**
* @author snowflake
* @email 278121951@qq.com
* @create-date 2019-08-10 13:56
*/
public class Quack implements QuackBehavior {
@Override
public void quack() {
System.out.println("嘎嘎");
}
}
Test(测试类)
package xyz.snowflake.strategy.book;
/**
* @author snowflake
* @email 278121951@qq.com
* @create-date 2019-08-10 14:30
*/
public class Test {
public static void main(String[] args) {
System.out.println("----------------测试用例1----------------");
// 创建一直绿头鸭
Duck mallard = new MallardDuck();
// 绿头鸭表演叫
mallard.performQuack();
// 绿头鸭表演飞
mallard.performFly();
System.out.println("----------------测试用例2----------------");
Duck modelDuck = new ModeDuck();
// 模型鸭表演飞
modelDuck.performFly();
// 模型鸭修改飞行行为
modelDuck.setFlyBehavior(new FlyRocketPowered());
// 模型鸭表演飞
modelDuck.performFly();
}
}
运行结果
----------------测试用例1----------------
嘎嘎
用翅膀飞
----------------测试用例2----------------
不能飞
坐火箭飞