二十二、策略模式

目录

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

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

相关推荐
Nontee4 天前
Quartz 集群 + 策略模式:逾期预警推送系统设计实录
linux·服务器·策略模式
二炮手亮子5 天前
从 BIO、NIO、AIO 到多路复用与 Netty
策略模式·nio
cui_hao_nan6 天前
大模型负责“聪明“,策略模式负责“执行“:智能配图系统如何自动选择图片来源
策略模式·ai开发
阿萨德528号9 天前
npm 包发布实战指南:从零发布、更新迭代到版本治理
前端·npm·策略模式
AI人工智能+电脑小能手9 天前
大白话说Java设计模式-26-策略模式(业务实战篇)
java·spring·设计模式·策略模式·支付系统·算法切换
coding4u10 天前
Mac 多桌面(Spaces)的正确用法:你的屏幕可以大三倍
macos·docker·计算机外设·文件管理·策略模式
AI人工智能+电脑小能手10 天前
大白话说Java设计模式-27-策略模式(源码剖析篇)
java·spring·设计模式·策略模式·源码分析·事务管理·comparator
小此方10 天前
Linux加餐(一):藏在Linux中的设计模式(一)策略模式与日志
linux·设计模式·策略模式
coding4u19 天前
Mac 外接显示器完全指南:从插上线到调好每个参数
macos·计算机外设·文件管理·显示器·策略模式·quick look扩展
神奇霸王龙21 天前
AgentDesk 配置 Codex+ selltoken 中转 API 实测教程(2026 年 8 月更新)
人工智能·ai·ai编程·策略模式·codex·agentdesk