【设计模式】策略模式

策略模式(Strategy Pattern)

策略模式是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互换使用。策略模式让算法的变化独立于使用算法的客户端,从而实现算法的灵活切换。

一、策略模式的定义

策略模式的核心思想是将算法的定义和使用分离,通过接口或抽象类定义算法的公共接口,然后通过具体的实现类来实现不同的算法。客户端可以通过设置不同的策略来改变算法的行为。

二、策略模式的结构

策略模式主要包含以下几个角色:

• 策略接口(Strategy):定义了算法的公共接口,所有策略类都实现这个接口。

• 具体策略类(ConcreteStrategy):实现策略接口的具体算法类。

• 上下文类(Context):维护一个对策略对象的引用,提供一个接口来执行策略定义的算法。

三、策略模式的实现

以下是一个简单的实现示例:

1.策略接口

java 复制代码
public interface Strategy {
    int doOperation(int num1, int num2);
}

2.具体策略类

java 复制代码
public class OperationAdd implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 + num2;
    }
}

public class OperationSubtract implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 - num2;
    }
}

public class OperationMultiply implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 * num2;
    }
}

3.上下文类

java 复制代码
public class Context {
    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public int executeStrategy(int num1, int num2) {
        return strategy.doOperation(num1, num2);
    }
}

4.客户端代码

java 复制代码
public class StrategyPatternDemo {
    public static void main(String[] args) {
        Context context = new Context(new OperationAdd());
        System.out.println("10 + 5 = " + context.executeStrategy(10, 5));

        context = new Context(new OperationSubtract());
        System.out.println("10 - 5 = " + context.executeStrategy(10, 5));

        context = new Context(new OperationMultiply());
        System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
    }
}

四、运行效果

运行上述代码后,输出如下:

复制代码
10 + 5 = 15
10 - 5 = 5
10 * 5 = 50

五、策略模式的优点

• 算法的可扩展性:

• 客户端可以根据需要选择不同的策略,而无需修改上下文类的代码。

• 算法的独立性:

• 每个策略类独立于其他策略类,便于维护和扩展。

• 避免条件语句:

• 策略模式可以避免使用大量的条件语句来选择算法,使代码更加清晰。

六、策略模式的缺点

• 策略类数量增加:

• 每个策略都需要一个具体的类,可能导致类的数量过多。

• 客户端需要了解策略类:

• 客户端需要知道所有策略类的存在,并根据需要选择合适的策略。

七、策略模式的应用场景

• 算法选择:

• 当需要在多种算法中选择一种时,策略模式可以方便地切换算法。

• 行为变化:

• 当对象的行为需要根据环境动态改变时,策略模式可以提供灵活的解决方案。

• 避免条件语句:

• 当需要避免使用大量的条件语句来选择算法时,策略模式可以简化代码。

八、总结

策略模式是一种非常实用的设计模式,通过将算法的定义和使用分离,实现了算法的灵活切换。通过合理使用策略模式,可以提高代码的可维护性和可扩展性,同时避免使用大量的条件语句。

java 复制代码
static class Solution_20250529213945_9c7b947c55904f768bf8e1b88dcd86ba {

        static public interface Strategy {
            int doOperation(int num1, int num2);
        }

        static public class OperationAdd implements Strategy {
            @Override
            public int doOperation(int num1, int num2) {
                return num1 + num2;
            }
        }

        static public class OperationSubtract implements Strategy {
            @Override
            public int doOperation(int num1, int num2) {
                return num1 - num2;
            }
        }

        static public class OperationMultiply implements Strategy {
            @Override
            public int doOperation(int num1, int num2) {
                return num1 * num2;
            }
        }

        static public class Context {
            private Strategy strategy;

            public Context(Strategy strategy) {
                this.strategy = strategy;
            }

            public int executeStrategy(int num1, int num2) {
                return strategy.doOperation(num1, num2);
            }
        }

        public static void main(String[] args) {
            Context context = new Context(new OperationAdd());
            System.out.println("10 + 5 = " + context.executeStrategy(10, 5));

            context = new Context(new OperationSubtract());
            System.out.println("10 - 5 = " + context.executeStrategy(10, 5));

            context = new Context(new OperationMultiply());
            System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
        }
    }
相关推荐
ghostwritten4 小时前
macOS安装配置Unbound DNS完整指南
macos·策略模式·dns
超龄超能程序猿5 小时前
Vue3 + Electron 技术栈下 MAC 地址获取的方法、准确性优化与应对策略
macos·electron·策略模式
找不到、了9 小时前
Java设计模式之<建造者模式>
java·设计模式·建造者模式
LoveC52114 小时前
设计模式之适配器模式
设计模式·适配器模式
永卿00115 小时前
设计模式-责任链模式
java·设计模式·责任链模式
Codebee20 小时前
OneCode 3.0 智能数据处理:快速视图中的智能分页与 @PageBar 注解详解
后端·设计模式
Codebee20 小时前
OneCode 3.0智能分页拦截器深度解析:从拦截机制到性能优化
后端·设计模式
是2的10次方啊20 小时前
🎭 Java设计模式详解:让代码优雅如诗的秘密武器
设计模式
万粉变现经纪人21 小时前
如何解决pip安装报错ModuleNotFoundError: No module named ‘dash’问题
python·scrapy·pycharm·flask·pip·策略模式·dash
python_13621 小时前
python设计模式-工厂模式
开发语言·python·设计模式