架构师修炼之设计模式 - 策略模式(Strategy) 【Python与C#实现】
程序员,我为你祝福
愿你有一个灿烂的前程
愿你有情人终成眷属
愿你在尘世获得幸福
我只想成为架构师,走遍江湖!
目录
- 模式定义
- 模式分类
- 模式结构
- 实例(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#实现】的更多相关文章
- [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型)
[.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模 ...
- 设计模式--策略模式(strategy)
1.策略模式(strategy ['strætədʒi]) 我的理解是:方案候选模式 (反正关键就是有很多的候选,哈哈) 看了很多例子,都是在说鸭子的,那个例子很好,在这里可以看 他们生产鸭子,我们就 ...
- 设计模式 - 策略模式(Strategy Pattern) 具体解释
策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全 ...
- java设计模式 策略模式Strategy
本章讲述java设计模式中,策略模式相关的知识点. 1.策略模式定义 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户.策略模式属于对象的 ...
- 设计模式——策略模式(Strategy Pattern)
写在前面: 直接将书中的例子用来作为记录自己学习的成果,不知道这样好不好,如果给原作者带来什么不利的影响不妨告知一声,我及时删掉. UML图: 抽象策略:Strategy package com.cn ...
- 说说设计模式~策略模式(Strategy)
返回目录 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.而对于客户端(UI)来说,可以通过IOC再配合工厂模块,实现动态策略的切换,策略模块通常于一个抽象策略对象(in ...
- C#设计模式——策略模式(Strategy Pattern)
一.概述我们来实现一个企业的工资系统,该企业中不同级别的员工工资算法都不相同,针对该问题,最容易想到的莫过于在代码中堆积一大堆if…else…语句或者是switch…case…语句.如果该企业中不同级 ...
- 设计模式-策略模式Strategy以及消灭if else
概述 如果在开发过程中,出现大量的if else或者switch case 语句,如果这些语句块中的代码并不是包含业务逻辑,只是单纯的分流方法,那么,每一个语句块中都是一个算法或者叫策略. 背景 比如 ...
- 设计模式---策略模式Strategy(对象行为型)
1. 概述 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不 ...
随机推荐
- VS code调试代码快速上手必备知识
一.通过简单的配置运行一个JavaScript程序 1.打开(创建)一个新的工作空间(文件夹),并创建一个js文件: var name='world'; var s='Hello,${name}!'; ...
- 加油站问题 Gas Station
2019-06-01 17:09:30 问题描述: 问题求解: 其实本题本质上是一个数学题. [定理] 对于一个循环数组,如果这个数组整体和 SUM >= 0,那么必然可以在数组中找到这么一个元 ...
- vim-0-indent(缩进)
缩进: 参考自http://liuzhijun.iteye.com/blog/1831548,http://blog.csdn.net/chenxiang6891/article/details/41 ...
- 潘粤明的《龙岭迷窟》到底怎么样?我用 Python 得出了一些结论!
对于天下霸唱的鬼吹灯,相信很多小伙伴都知道,它可谓是国内盗墓寻宝系列小说的巅峰之作,最近得知该系列小说的<龙岭迷窟>部分被制作成了网剧,已经于 4 月 1 日开播了,主要演员潘粤明.姜超. ...
- mybatis 源码赏析(一)sql解析篇
本系列主要分为三部分,前两部分主要分析mybatis的实现原理,最后一部分结合spring,来看看mybtais是如何与spring结合的就是就是mybatis-spring的源码. 相较于sprin ...
- springboot系列(三)配置文件详解
目录 properties 文件 1.语法 2.优先级 3.自定义数据配置 4.获取自定义数据配置 1.通过prefix获取 yml文件 1.语法 2.优先级 3.自定义数据配置. 4.获取自定义数据 ...
- C++ 简单信息的表示和基本运算
一.算术运算和自增自减运算 二.关系运算 三.逻辑运算 四.位运算 五.特殊运算符 六.混合运算中的类型转换
- 服务器部署Jupyter Notebook
先安装jupyter notebook pip install ipython pip install jupyter 创建一个目录(jupyter notebook工作目录) mkdir jupyt ...
- C 怪兽游戏
时间限制 : - MS 空间限制 : - KB 评测说明 : 1s,256m 问题描述 何老板在玩一款怪兽游戏.游戏虽然简单,何老板仍旧乐此不疲.游戏一开始有N只怪兽,编号1到N.其中第i只怪兽 ...
- # H - H HDU - 2066 (多起点、多终点问题)
H - H HDU - 2066 (多源点.多汇点问题) 一个图上,有M条边,Z个出发点,Y个终止点.求一条最短路,其中起点是Z中的任意一点,终点是Y中任意一点. Input 输入数据有多组,输入直到 ...