二十二、策略模式

目录

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

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

相关推荐
zhangfeng11334 小时前
com.apple.quarantine 并不是乱码,而是 macOS Gatekeeper 给下载文件自动打上的“隔离属性
macos·策略模式
lpfasd1232 天前
Ollama 还是 LM Studio:在 24GB 的 M6 Mac 上,我把 Ollama 卸载了
macos·策略模式
福大大架构师每日一题4 天前
ollama v0.40.11发布:macOS原生语音生成上线,d3决策模型正式加入
macos·策略模式
AIex-YH7 天前
发酵罐里点一盏灯:光发酵,正在重算微藻蛋白的成本账
运维·制造·策略模式
snakecy7 天前
macOS 安装 LaTeX 全流程指南:从 MacTeX 到中文排版
macos·策略模式
钱栈up12 天前
从 macOS 切回 Windows,我用 5 个免费工具把 80% 操作习惯搬了回来
windows·macos·策略模式
kunicoding14 天前
C++ 策略模式实战:写一个可以“一键换输出“的日志系统
开发语言·c++·策略模式
峥嵘life15 天前
Android16 开机后立即打开相机闪退问题分析与解决总结
android·开发语言·数码相机·策略模式
智慧城市203016 天前
关键供应商连续交付不合格批次,说明质量风险可能持续存在。企业需要建立“批次隔离、加严检验、驻厂遏制、复检放行、供应商升级”的处置闭环,同时统筹保供。
数据分析·策略模式·战略咨询·流程管理
happy_baymax17 天前
Dell G3 3590 黑苹果实战:OpenCore 1.0.8 + NullMoth 驱动让 GTX 1660 跑起 Metal
策略模式