Strategy模式

本文详细介绍了Strategy模式,包括其意图、解决的问题、何时使用、如何实现以及关键代码。通过示例展示了如何在程序中运用策略模式,替换算法并提高代码灵活性。
摘要由CSDN通过智能技术生成

title: Strategy模式
tag: 笔记 设计模式

image-20231030205213905

Strategy模式

无论什么程序,其目的都是解决问题。而为了解决问题,我们又需要编写特定的算法。使用Strategy模式可以整体地替换算法的实现部分。能够整体地替换算法,能让我们轻松地以不同的算法去解决同一个问题,这种模式就是Strategy模式。

介绍

**意图:**定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

**主要解决:**在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。

**何时使用:**一个系统有许多许多类,而区分它们的只是他们直接的行为。

**如何解决:**将这些算法封装成一个一个的类,任意地替换。

**关键代码:**实现同一个接口。

优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。

缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。

使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

**注意事项:**如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。

示例程序

该程序的作用是根据不同的策略执行不同的算术符。

image-20231030205958370
  • Strategy接口:定义了算术符策略的接口,在Context类中使用。
  • OpearationAdd等实现类:具体的策略,包含具体的算法实现。
  • Context类:负责将客户端的请求委托给具体的策略对象执行。

Strategy接口

public interface OperationStrategy {
    int doOperation(int a, int b);
}

具体的策略类

public class OperationAdd implements OperationStrategy{
    @Override
    public int doOperation(int a, int b) {
        return a + b;
    }
}

public class OperationMultiply implements OperationStrategy{

    @Override
    public int doOperation(int a, int b) {
        return a * b;
    }
}

public class OperationSubtract implements OperationStrategy{
    @Override
    public int doOperation(int a, int b) {
        return a / b;
    }
}

我们定义了三种不同的策略,分别是加法,乘法和除法。

Context类

public class Context {
    OperationStrategy strategy;
    
    public Context(OperationStrategy strategy){
        this.strategy = strategy;
    }

    public int executeStrategy(int a, int b) {
        return strategy.doOperation(a, b);
    }
}

该类初始化需要传入一个策略类,并在executeStrategy方法中,调用策略类的具体算法。

测试

public static void main(String[] args) {
    System.out.println(new Context(new OperationAdd()).executeStrategy(10, 5));
    System.out.println(new Context(new OperationMultiply()).executeStrategy(10, 5));
    System.out.println(new Context(new OperationSubtract()).executeStrategy(10, 5));
}

输出:

15
50
2

Strategy类中的角色

  • Strategy(策略)

**Strategy角色负责决定实现策略所必需的接口(API)。**在示例程序中,由Strategy接口扮演此角色。

  • ConcreteStrategy(具体的策略)

ConcreteStrategy角色负责实现Strategy角色的接口(API),即负责实现具体的策略(战略、方向、方法和算法)。在示例程序中,由OpearationAdd等实现类扮演此角色。

  • Context(上下文)

负责使用Strategy角色。Context角色保存了ConcreteStrategy角色的实例,并使用ConcreteStrategy角色去实现需求。在示例程序中,由Context类扮演此角色。

此角色。

  • Context(上下文)

负责使用Strategy角色。Context角色保存了ConcreteStrategy角色的实例,并使用ConcreteStrategy角色去实现需求。在示例程序中,由Context类扮演此角色。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值