代码编织梦想

策略模式(Strategy Pattern)

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

介绍

意图

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

主要解决:

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

如何解决:

将这些算法封装成一个一个的类,任意地替换。

关键代码:

实现同一个接口。

优点:

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

缺点:

1. 策略类会增多。 
2. 所有策略类都需要对外暴露。

何时使用:

一个系统有许多许多类,而区分它们的只是他们直接的行为。

使用场景:

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

应用实例:

1. 诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 
2. 旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。
3. JAVA AWT 中的 LayoutManager。

注意事项:

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

实现

我们将创建一个定义活动的 Strategy 接口和实现了 Strategy 接口的实体策略类。Context 是一个使用了某种策略的类。

StrategyPatternDemo,我们的演示类使用 Context 和策略对象来演示 Context 在它所配置或使用的策略改变时的行为变化。

策略模式的 UML 图
策略模式的 UML 图

步骤 1

创建一个接口。

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

步骤 2
创建实现接口的实体类。

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

创建 Context 类。

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

使用 Context 来查看当它改变策略 Strategy 时的行为变化。

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));
    }
}

步骤 5

执行程序,输出结果:

10 + 5 = 15
10 - 5 = 5
10 * 5 = 50
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sgdhshagf/article/details/128017778

学习笔记 c++ ( C++设计模式-策略模式 实例)-爱代码爱编程

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。 代码实例: #include<iostream> using nam

strategy模式 java_Java设计模式之Strategy模式-爱代码爱编程

基于有了OO的基础后,开始认真学习设计模式!设计模式是java设计中必不可少的! Apple.java package strategy; /** * * @author Andy * */ public class Apple implements Discountable { //重量 private double weight

C++实现策略模式-爱代码爱编程

文章目录 1. 情景与意图2. 策略模式3. 计算器程序4. 理解策略模式6. 总结 1. 情景与意图   有这样一个场景,你设计了一款计算器,这款计算器有加减乘除四个运算方式,这个计算器放在小学生手上是可以的,如果放在中学生手上,还需要开方,平方,三角函数等。此时你可能会像把这些算法在加到计算器上,在程序员手上可能还需要二

策略模式(C++实现)-爱代码爱编程

策略模式 定义一系列的算法,把他们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。属于行为型模式。 适用场景 1、许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。 2、需要使用一个算法的不同变体。例如,你可能会定义一些反映不同的空间 /时间权衡的算法。当这些变体实现为一个算法的类层次

C++策略模式-爱代码爱编程

策略模式(Strategy)是一种行为设计模式,他能让你定义一系列的算法,并将每种算法分别放入到独立的类中,以使算法的对象能够相互替换 动机(Motivation) 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。如何在运行时根据需要透明地更改

C++策略模式(Strategy Pattern)-爱代码爱编程

意图 定义一系列的算法,把它们一个一个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。 动机 需要换行功能的客户程序如果直接包含换行算法代码的话讲会变得复杂,这使得客户程序庞大并且难以维护,尤其当其需要支持多种换行算法时问题会更加严重。不同的时候需要不同的算法,我们不想支持我们并不使用的换行算法。当换行功能时客户程序的一个难

C++设计模式:策略模式-爱代码爱编程

策略模式:符合开闭原则,如果if else过多或者有待增加时宜使用,节省高级缓存指令空间占用 行为型设计模式,不同的创建型对象的具体行为 分析重构前的代码: class Review { public: enum FoodType { CHINA, JAPAN }; public: void isYummy() { if (ty

C++策略模式用法总结-爱代码爱编程

1 模式概念 策略模式(Strategy Pattern),定义一系列算法,将每一个算法封装起来,并让它们可以相互替换,策略模式是一种对象行为型模式。 符合依赖倒置原则: 依赖倒置原则 A.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。 B.抽象不应该依赖于具体,具体应该依赖于抽象。 2 模式结构 (1) Context 

【C++设计模式】策略模式-爱代码爱编程

背景 策略模式(Strategy模式)是行为模式之一,它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法(策略)选择交由客户端决定。Strategy模式主要用来平滑地处理算法的切换 。 策略模式的UML类图如下,主要的类有三个: 1.抽象策略类Strategy,定义所有支持的算法的公

C++设计模式(五)- 策略模式-爱代码爱编程

“组件协作”模式: 现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。典型模式 Template MethodStrategyObserver / Event模式定义: 定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(变化)。该模式使

java设计模式种strategy模式简述与使用_m0_52156487的博客-爱代码爱编程

strategy模式简述与使用 java设计模式概述: 为了提高代码的可读性,可扩展性以及代码的复用性,为了解决在写代码过程中遇到的代码设计问题,全世界开发人员集众智总结出许多优秀的代码设计模式。 java的设计模式众多,有23种,大致可以分为三类: 1.创造型模式 有工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。初级阶段需要掌握最重要最

c++策略模式_燃犀要加油啊的博客-爱代码爱编程

文章目录 1.策略模式2.代码实现3.实现效果图 1.策略模式 策略模式定义了一系列的算法,并将一个算法封装起来,而且是他们还可以相互替换,策略模式让算法独立于使用它的客户而独立变化 2.代码实现 #include <iostream> #include <vector> #include <algorith

c++设计模式之策略模式_zby-枣菠鱼的博客-爱代码爱编程

1. 策略模式定义一系列的算法,把他们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。属于行为型模式。 2. 适用场景 (1)许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个

设计模式-策略模式【strategy pattern】_爱吃java的猴子的博客-爱代码爱编程

刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题, 嘿,还别说,真是解决了大问题,搞到最后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子 的。 先说这个场景中的要素:三个妙计,

java设计模式-爱代码爱编程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、策略模式二、策略模式示例代码1.支付策略2.具体支付策略实现3.策略执行对象4.测试 总结 前