你知道策略模式吗?

策略模式(StrategyMode)

一、策略模式

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

二、举例

设计一个鸭子类,要求如下

  • 飞,这种行为有多种变化
  • 叫,这种行为有多种变化
  • 展示,展示这只鸭子的种类
  • 游泳行为,所有的鸭子都应该会游泳

分析:由于鸭子的飞、叫这种行为具有变化性,所以我们应该将变化独立封装起来,因此我们可以单独定义两个行为接口类,一个飞行为接口类,叫行为接口类,同时使用与之对应的不同的行为子类去实现,这样的一种设计模式就是策略模式。接下来看代码
鸭子类

package com.jackeys.StrategyMode;

/**
 * @Description: 鸭子类
 * @ClassName: Duck
 * @Package com.jackeys.StrategyMode
 * @Author: Jackeys 1623427047@qq.com
 * @Copyright 版权归Jackeys企业(或个人)所有
 * @CreateTime: 2021/10/4 9:55
 * @Version: 1.0
 */
public abstract class Duck {

    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;
    public Duck(){}

    public abstract void display();

    public void swim(){
        System.out.println("所有的鸭子都会游泳");
    }

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

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

飞行为接口类

package com.jackeys.StrategyMode;

/**
 * @Description: 飞行行为接口
 * @ClassName: FlyBehavior
 * @Package com.jackeys.StrategyMode
 * @Author: Jackeys 1623427047@qq.com
 * @Copyright 版权归Jackeys企业(或个人)所有
 * @CreateTime: 2021/10/4 9:57
 * @Version: 1.0
 */
public interface FlyBehavior {
    void fly();
}

不会飞的行为实现类

package com.jackeys.StrategyMode;

/**
 * @Description: 不会飞的行为实现类
 * @ClassName: FlyNoWay
 * @Package com.jackeys.StrategyMode
 * @Author: Jackeys 1623427047@qq.com
 * @Copyright 版权归Jackeys企业(或个人)所有
 * @CreateTime: 2021/10/4 9:59
 * @Version: 1.0
 */
public class FlyNoWay implements FlyBehavior{
    @Override
    public void fly() {
        System.out.println("我不会飞");
    }
}

会飞的行为实现类

package com.jackeys.StrategyMode;

/**
 * @Description: 飞的行为实现类
 * @ClassName: FlyWithWings
 * @Package com.jackeys.StrategyMode
 * @Author: Jackeys 1623427047@qq.com
 * @Copyright 版权归Jackeys企业(或个人)所有
 * @CreateTime: 2021/10/4 9:58
 * @Version: 1.0
 */
public class FlyWithWings implements FlyBehavior{
    @Override
    public void fly() {
        System.out.println("我会飞");
    }
}

叫行为接口类

package com.jackeys.StrategyMode;

/**
 * @Description: 叫声接口
 * @ClassName: QuackBehavior
 * @Package com.jackeys.StrategyMode
 * @Author: Jackeys 1623427047@qq.com
 * @Copyright 版权归Jackeys企业(或个人)所有
 * @CreateTime: 2021/10/4 10:00
 * @Version: 1.0
 */
public interface QuackBehavior {
    void quack();
}

呱呱叫行为接口实现类

package com.jackeys.StrategyMode;

/**
 * @Description: 呱呱叫行为的实现类
 * @ClassName: Quack
 * @Package com.jackeys.StrategyMode
 * @Author: Jackeys 1623427047@qq.com
 * @Copyright 版权归Jackeys企业(或个人)所有
 * @CreateTime: 2021/10/4 10:01
 * @Version: 1.0
 */
public class Quack implements QuackBehavior{
    @Override
    public void quack() {
        System.out.println("呱呱呱");
    }
}

吱吱叫行为接口实现类

package com.jackeys.StrategyMode;

/**
 * @Description: 吱吱交行为实现类
 * @ClassName: Squeak
 * @Package com.jackeys.StrategyMode
 * @Author: Jackeys 1623427047@qq.com
 * @Copyright 版权归Jackeys企业(或个人)所有
 * @CreateTime: 2021/10/4 10:04
 * @Version: 1.0
 */
public class Squeak implements QuackBehavior{
    @Override
    public void quack() {
        System.out.println("吱吱吱");
    }
}

不会叫行为接口实现类

package com.jackeys.StrategyMode;

/**
 * @Description: 不会叫行为的实现类
 * @ClassName: MuteQuack
 * @Package com.jackeys.StrategyMode
 * @Author: Jackeys 1623427047@qq.com
 * @Copyright 版权归Jackeys企业(或个人)所有
 * @CreateTime: 2021/10/4 10:02
 * @Version: 1.0
 */
public class MuteQuack implements QuackBehavior{
    @Override
    public void quack() {
        System.out.println("沉默中......");
    }
}

测试

package com.jackeys.StrategyMode;

/**
 * @Description: 测试
 * @ClassName: Test
 * @Package com.jackeys.StrategyMode
 * @Author: Jackeys 1623427047@qq.com
 * @Copyright 版权归Jackeys企业(或个人)所有
 * @CreateTime: 2021/10/4 10:10
 * @Version: 1.0
 */
public class Test {
    public static void main(String[] args) {
        Duck duck=new MallardDuck();
        duck.performFly();//我会飞
        duck.performQuack();//呱呱呱
        duck.display();//我是一只绿头鸭
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值