二十二、策略模式

目录

以具体项目来演示为什么需要策略模式,策略模式的优点,以及策略模式使用过程中需要注意的问题

1、项目需求

  • 有各种有鸭子(野鸭、北京鸭子、烤鸭),鸭子有各种行为(飞、叫),但是各种鸭子的行为又不完全一样
  • 显示鸭子信息

2、传统方案解决鸭子问题的分析和代码实现

1)传统设计方案

设计一个抽象父类 duck , 定义各种行为,然后各种鸭子种类继承该父类,重新行为方法

2)代码实现

java 复制代码
public abstract class Duck {


    public abstract void display();

    public void quack() {
        System.out.println("鸭子嘎嘎叫~~~");
    }

    public void swim() {
        System.out.println("鸭子会游泳~~~");
    }


    public void fly() {
        System.out.println("鸭子会飞翔~~~");
    }
}

public class BjDuck extends Duck{


    @Override
    public void display() {
        System.out.println("这是一直北京鸭子~~~~");
    }

    @Override
    public void fly() {
        System.out.println("北京鸭子不能飞翔!!");
    }
}

3、传统方式实现存在的问题分析和解决方案

1)存在的问题

不同子类的行为是不一样的,所以每次定义一个子类就需要重写父类的行为,导致代码太耦合

2)解决方式

使用策略模式

4、策略模式基本介绍

策略模式:指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法

策略模式体现了几个原则:

  • 把变化的代码从不变的代码中抽离出来
  • 针对接口编程而不是类
  • 多采用组合,聚合,少用继承的模式

策略模式基本类图:

5、使用策略模式解决鸭子问题

  • 封装行为接口,实现算法族
  • 超类中放行为的接口对象,在子类中具体设定行为对象

1) 定义行为接口,行为接口的具体实现类

java 复制代码
// 飞行行为
public interface FlyBehavior {

    void fly();
}

public class NoflyBehavior implements FlyBehavior{

    @Override
    public void fly() {
        System.out.println("不会飞");
    }
}

public class GoodflyBehavior implements FlyBehavior{
    @Override
    public void fly() {
        System.out.println("具备很好的飞行技能!!");
    }
}

// 叫行为
public interface QuackBehavior {

    void quack();
}
public class NoQuackBehavior implements QuackBehavior {
    @Override
    public void quack() {
        System.out.println("不能叫");
    }
}
public class GeGeQuackBehavior implements QuackBehavior{

    @Override
    public void quack() {
        System.out.println("咯咯叫");
    }
}

2)超类中聚合行为接口

java 复制代码
public abstract class Duck {

    FlyBehavior flyBehavior;

    QuackBehavior quackBehavior;

    public abstract void display();

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

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

3)实现类中设置具体的行为对象

java 复制代码
public class BjDuck extends Duck{

    public BjDuck() {
        this.flyBehavior = new BadflyBehavior();
        this.quackBehavior = new GeGeQuackBehavior();
    }

    @Override
    public void display() {
        System.out.println("我叫做北京鸭子!!");
    }

}

4)测试

复制代码
public class Test {
    public static void main(String[] args) {
        BjDuck bjDuck = new BjDuck();
        bjDuck.display();
        bjDuck.fly();
        bjDuck.quack();
    }
}

6、策略模式的注意事项和细节

  • 策略模式的关键是:分析项目中的变化和不变部分
  • 核心思想:多使用组合,少使用继承;用行为类进行组合,而不是行为的继承

需要注意的是:每添加一个策略就要增加一个类,当策略过多时会导致类数目庞大!!!

7、策略模式的使用场景

https://blog.csdn.net/m4330187/article/details/121292879

相关推荐
意法半导体STM3217 天前
【官方原创】如何为STM32CubeMX2配置Visual Studio Code配置方案
vscode·stm32·单片机·嵌入式硬件·策略模式·stm32cubemx·嵌入式开发
山东点狮信息科技有限公司18 天前
企业级 MES 制造执行系统架构设计与实践
spring cloud·性能优化·系统架构·策略模式·点狮
zzqssliu18 天前
基于策略模式与责任链的代购商品多源采集架构实战
架构·策略模式
mxpan19 天前
macOS 13+ 上使用 macFUSE + NTFS-3G 读写 NTFS 移动硬盘技术说明
macos·策略模式
折哥的程序人生 · 物流技术专研19 天前
Java 23 种设计模式:从踩坑到精通 | 番外:编排器+策略模式在多平台电子面单中的实战(含性能压测)
设计模式·策略模式·代码重构·java设计模式·编排器·电子面单·从踩坑到精通
忧云20 天前
2026年最新 Cursor 国内使用 DeepSeek API等各模型使用完整教程
ai编程·策略模式·cursor·byok·cursor使用国内大模型
AIex-YH20 天前
三域贯通11/12:生物制造的“死亡之谷“,CDMO 是桥还是船?
运维·制造·策略模式
回忆2012初秋21 天前
【Nginx】原理、配置与运维实战(2)
运维·nginx·策略模式
怎么没有名字注册了啊21 天前
macOS 基于 CSDN GitCode + Homebrew Tap 发布 Qt .app 二进制程序通用教程(homebrew 安装自己的软件)
策略模式·homebrew·formula·ruhy
坏小虎22 天前
macOS 安装 Ghostty 终端完整教程:环境、依赖与美化配置
macos·策略模式