Java设计模式-策略设计模式(代码实现)

策略设计模式

定义

定义一个算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户

策略模式模拟(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----------------
不能飞
坐火箭飞

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值