二十二、策略模式

目录

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

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

相关推荐
冰糖拌面2 天前
CRLF行结束符问题
策略模式
原来是好奇心3 天前
告别if-else!使用策略模式优雅处理多种MQTT消息类型
java·mqtt·设计模式·策略模式·emqx
Mr_WangAndy4 天前
C++设计模式_行为型模式_策略模式Strategy
c++·设计模式·策略模式·依赖倒置原则
mjhcsp4 天前
C++ long long 类型深度解析:大整数处理的基石
开发语言·c++·策略模式·long long
太过平凡的小蚂蚁8 天前
策略模式:让算法选择像点菜一样简单
算法·策略模式
让我上个超影吧9 天前
设计模式【工厂模式和策略模式】
java·设计模式·策略模式
bkspiderx12 天前
C++设计模式之行为型模式:策略模式(Strategy)
c++·设计模式·策略模式
_Yoke14 天前
Java 枚举多态在系统中的实战演进:从枚举策略到自动注册
java·springboot·策略模式
笨手笨脚の15 天前
设计模式-策略模式
设计模式·策略模式·行为型设计模式
2501_9159214315 天前
iOS 26 崩溃日志解析,新版系统下崩溃获取与诊断策略
android·ios·小程序·uni-app·cocoa·iphone·策略模式