程序员,我为你祝福

愿你有一个灿烂的前程

愿你有情人终成眷属

愿你在尘世获得幸福

我只想成为架构师,走遍江湖!

目录

  • 模式定义
  • 模式分类
  • 模式结构
  • 实例(C#与Python版)
  • 优点
  • 缺点
  • 使用场景

模式定义

它定义一系列算法,将每一个算法封装起来,并让它们之间可以相互替换。此模式让算法的变化,不会影响到使用算法的客户,也称为政策模式(Policy)。

模式分类

属于行为型模式。

模式结构

主要成员:

  • Context:上下文类。用一个具体ConcreteStrategy策略来配置,维护一个对Strategy对象的引用;
  • Strategy:抽象策略类。定义算法公共接口;
  • ConcreteStrategy:具体策略类。继承于Strategy,封装具体的算法或者行为。

实例

Python版本:


Strategy.py

from abc import ABC, abstractmethod

class Strategy(ABC):
"""抽象类""" def __init__(self):
"""构造函数"""
@abstractmethod
def algorithmInterface(self):
"""抽象方法"""

ConcreteStrategy.py

from Strategy import Strategy

class ConcreteStrategyA(Strategy):
def __init__(self):
super().__init__()
def algorithmInterface(self):
print("算法A实现") class ConcreteStrategyB(Strategy):
def __init__(self):
super().__init__()
def algorithmInterface(self):
print("算法B实现")

Context.py

from Strategy import Strategy

class Context():
def __init__(self):
"""构造函数""" def setStrategy(self, strategy):
"""设置算法"""
self._strategy = strategy def contextInterface(self):
"""执行算法"""
self._strategy.algorithmInterface()

Client.py

from Context import Context
from ConcreteStrategy import ConcreteStrategyA, ConcreteStrategyB context = Context()
context.setStrategy(ConcreteStrategyA())
context.contextInterface() context.setStrategy(ConcreteStrategyB())
context.contextInterface()

执行结果:

C#版本:


Strategy.cs

using System;

namespace Strategy
{
public abstract class Strategy
{
public abstract void AlgorithmInterface();
}
}

ConcreteStrategyA.cs

using System;

namespace Strategy
{
public class ConcreteStrategyA : Strategy
{
public override void AlgorithmInterface()
{
Console.WriteLine("算法A实现");
}
}
}

ConcreteStrategyB.cs

using System;

namespace Strategy
{
public class ConcreteStrategyB : Strategy
{
public override void AlgorithmInterface()
{
Console.WriteLine("算法B实现");
}
}
}

Context.cs

using System;

namespace Strategy
{
public class Context
{
private Strategy _strategy;
public Context()
{ } public void SetStrategy(Strategy strategy)
{
_strategy = strategy;
} public void ContextInterface()
{
_strategy.AlgorithmInterface();
}
}
}

Client.cs

using System;

namespace Strategy
{
public class Client
{
public static void Main(string[] args)
{
var context = new Context();
context.SetStrategy(new ConcreteStrategyA());
context.ContextInterface(); context.SetStrategy(new ConcreteStrategyB());
context.ContextInterface(); Console.Read();
}
}
}

优点

  • 将算法封装到一个个独立的Strategy子类,可以在使用算法时消除条件判断语句。
  • 由于每个算法是独立的,方便单元测试。
  • 由于抽象类Strategy定义了一系列算法或行为的接口,通过继承它可以灵活快速的添加新算法或行为。
  • 算法或行为的调用通过Context上下文处理,方便管理。

缺点

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。

使用场景

以下情况可以使用策略模式:

  • 如果系统中某个类的某一行为存在多种实现方式,而且这些实现方式可以互换时;(比如C#的泛型)
  • 一个系统需要动态地在几种算法中选择一种时;(比如商场打折系统)
  • 如果一个对象有很多的行为,这些行为使用多重的条件选择语句时;
  • 如果需要对算法数据结构进行保密时;

架构师修炼之设计模式 - 策略模式(Strategy) 【Python与C#实现】的更多相关文章

  1. [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型)

    [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模 ...

  2. 设计模式--策略模式(strategy)

    1.策略模式(strategy ['strætədʒi]) 我的理解是:方案候选模式 (反正关键就是有很多的候选,哈哈) 看了很多例子,都是在说鸭子的,那个例子很好,在这里可以看 他们生产鸭子,我们就 ...

  3. 设计模式 - 策略模式(Strategy Pattern) 具体解释

    策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全 ...

  4. java设计模式 策略模式Strategy

    本章讲述java设计模式中,策略模式相关的知识点. 1.策略模式定义 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户.策略模式属于对象的 ...

  5. 设计模式——策略模式(Strategy Pattern)

    写在前面: 直接将书中的例子用来作为记录自己学习的成果,不知道这样好不好,如果给原作者带来什么不利的影响不妨告知一声,我及时删掉. UML图: 抽象策略:Strategy package com.cn ...

  6. 说说设计模式~策略模式(Strategy)

    返回目录 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.而对于客户端(UI)来说,可以通过IOC再配合工厂模块,实现动态策略的切换,策略模块通常于一个抽象策略对象(in ...

  7. C#设计模式——策略模式(Strategy Pattern)

    一.概述我们来实现一个企业的工资系统,该企业中不同级别的员工工资算法都不相同,针对该问题,最容易想到的莫过于在代码中堆积一大堆if…else…语句或者是switch…case…语句.如果该企业中不同级 ...

  8. 设计模式-策略模式Strategy以及消灭if else

    概述 如果在开发过程中,出现大量的if else或者switch case 语句,如果这些语句块中的代码并不是包含业务逻辑,只是单纯的分流方法,那么,每一个语句块中都是一个算法或者叫策略. 背景 比如 ...

  9. 设计模式---策略模式Strategy(对象行为型)

    1. 概述 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不 ...

随机推荐

  1. 解析“60k”大佬的19道C#面试题(上)

    解析"60k"大佬的19道C#面试题(上) 先略看题目: 请简述async函数的编译方式 请简述Task状态机的实现和工作机制 请简述await的作用和原理,并说明和GetResu ...

  2. Redis总结--【持续更新】

    # 什么是Redis? Redis 是完全开源免费的,是一个高性能的key-value内存数据库,读的速度是110000次/s,写的速度是81000次/s     它有以下三个特点:   Redis不 ...

  3. iOS URL schemes

    来源:知乎 launch center pro支持的参数主要有两个,[prompt]文本输入框和[clipboard]剪贴板 淘宝宝贝搜索 taobao://http://s.taobao.com/? ...

  4. c++实现单纯形法现行规划问题的求解

    在本程序中默认该现行规划问题有最优解 针对此问题: #include<iostream> using namespace std; int check(float *sigema, int ...

  5. SpringCloud-Nacos/OpenFien/Gateway的基本介绍及快速上手

    一.Spring-Cloud-Alibaba-Nacos 注册中心 1.下载.安装 Nacos 下载地址:https://github.com/alibaba/nacos/releases 下载后解压 ...

  6. Matlab 编程简介与实例

    函数作图 二维平面曲线作图函数  plot(x, y, 's') x, y是长度相同的向量,s表示线型和颜色 如果作多条曲线在同一图上,则用函数: plot(x1, y1, 's1', x2, y2, ...

  7. M_map(五)

    一.圆形区域的画图 1. clear all LATLIMS=[14 22]; LONLIMS=[108 118];%南海边界范围 m_proj('miller','lon',LONLIMS,'lat ...

  8. Vue的父子组件v-model双向绑定,父组件修改子组件中绑定的v-model属性

    先来看下实现的效果,父组件中有个文本框,在点击下面按钮时弹出抽屉,抽屉里也有个文本框,文本框里的初始值要和父组件的文本框同步,并且修改抽屉里的文本框值时 父组件里的文本框值也要跟着改变 网上有大概三种 ...

  9. python常用模块 以及第三方导入

    python常用模块 1模块的分类 标准模块(内置模块)( 标准库 )300 第三方模块 18万 pip install 直接通过pip安装 软件一般会被自动安装你python安装目录的这个子目录里 ...

  10. A AK的距离

    时间限制 : - MS   空间限制 : - KB  评测说明 : 1s,128m 问题描述 同学们总想AK.于是何老板给出一个由大写字母构成的字符串,他想你帮忙找出其中距离最远的一对'A'和'K'. ...