极简设计模式 - 策略模式


前言

设计模式系列目录
 
策略模式(Strategy Pattern) 定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。


类图

理解思路最重要。如有纰漏或者更好更简单的方法,欢迎探讨。
策略模式UML

代码

来,上代码
https://github.com/software-market/design-pattern(欢迎star,谢谢各位大佬。)

FlyBehavior接口

public interface FlyBehavior {
    void fly();
}

Fly1、Fly2实现

public class Fly1 implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("飞行策略1");
    }
}

public class Fly2 implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("飞行策略2");
    }
}

QuackBehavior接口

public interface QuackBehavior {
    void quack();
}

Quack1、Quack2实现

public class Quack1 implements QuackBehavior{
    @Override
    public void quack() {
        System.out.println("叫声策略1");
    }
}

public class Quack2 implements QuackBehavior{
    @Override
    public void quack() {
        System.out.println("叫声策略2");
    }
}

Duck抽象类

public abstract class Duck {
    private FlyBehavior flyBehavior;
    private QuackBehavior quackBehavior;

    void fly(){
        flyBehavior.fly();
    }

    void quack(){
        quackBehavior.quack();
    }

    public void setFlyBehavior(FlyBehavior flyBehavior) {
        this.flyBehavior = flyBehavior;
    }

    public void setQuackBehavior(QuackBehavior quackBehavior) {
        this.quackBehavior = quackBehavior;
    }
}

测试类

public class Test {
    public static void main(String[] args) {
        Duck duck = new MyDuck1();
        duck.setFlyBehavior(new Fly1()); // 设置飞行策略1
        duck.setQuackBehavior(new Quack1()); // 设置呱呱策略1

        duck.fly(); // 执行的是飞行策略1
        duck.quack(); // 执行的是叫声策略1

        // 动态改变策略
        duck.setFlyBehavior(new Fly2()); // 设置飞行策略2
        duck.setQuackBehavior(new Quack2()); // 设置叫声策略2

        duck.fly(); // 执行的是飞行策略2
        duck.quack(); // 执行的叫声策略2
    }
}

执行结果:

飞行策略1
叫声策略1
飞行策略2
叫声策略2

总结

其实就是抽象类中持有接口,此时是类将行为委托出去了。
被委托接口的众多实现类就叫做算法族或者称为众多策略
类中包含setter方法,可以随时变更策略,调用者只需要选择策略和执行策略即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值