02、策略模式(Strategy)
一、概念:
策略是为达到某一目的而采取的手段或方法,策略模式的本质是目标与手段的分离,
手段不同而最终达成的目标一致。客户只关心目标而不在意具体的实现方法,
实现方法要根据具体的环境因素而变化。
二、案例思路
用我们每天上下班的方式来展开:
我们上下班的交通方式有:
1、步行
2、骑直行车
3、地铁
4、开车
三、类图

四、代码
1、首先我们声明策略类,父类Strategy,定义为抽象类,方法也为抽象方法,便于子类进行相关的实现。
public abstract class Strategy
{
public abstract void AtWalk();
}
2、声明几个上班方式的子类继承自父类Strategy
// 1、汽车 2、步行 3、地铁
public class WalkStrategy:Strategy
{
public override void AtWalk()
{
Console.WriteLine("我是走路去上班的");
}
}
public class SubwayStrategy:Strategy
{
public override void AtWalk()
{
Console.WriteLine("我是挤地铁的");
}
}
public class CarStrateg : Strategy
{
public override void AtWalk()
{
Console.WriteLine("小康,开车上下班");
}
}
3、写出Context类上下文代码;
//山下文
public class Context
{
Strategy strategy = null;
public Context (Strategy strategy)
{
this.strategy = strategy;
}
//上下文接口
public void ContextInterface()
{
strategy.AtWalk();
}
}
4、到这一步,策略模式的核心就已经完成了,接下来就可以对策略模式进行相关的测试了;
//山下文
public class Context
{
Strategy strategy = null;
public Context (Strategy strategy)
{
this.strategy = strategy;
}
//上下文接口
public void ContextInterface()
{
strategy.AtWalk();
}
}
5、输出如图;

6、这里再扩充下,让策略模式和简单工厂进行结合
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
//注意,调用的时候被指定调用了,可以自己设置一个限制条件来限制客户的输入,希望读者可以自己去探索 Context context = new Context("car");
context.ContextInterface();
Console.ReadKey();
}
}
public abstract class Strategy
{
public abstract void AtWalk();
} // 1、汽车 2、步行 3、地铁 public class WalkStrategy : Strategy
{
public override void AtWalk()
{
Console.WriteLine("我是走路去上班的");
}
}
public class SubwayStrategy : Strategy
{
public override void AtWalk()
{
Console.WriteLine("我是挤地铁的");
}
}
public class CarStrateg : Strategy
{
public override void AtWalk()
{
Console.WriteLine("小康,开车上下班");
}
}
//山下文
public class Context
{
Strategy strategy = null;
public Context(string name)
{
switch(name)
{
case "car":
strategy = new CarStrateg();
break;
case "walk":
strategy = new WalkStrategy();
break;
case "subway":
strategy = new SubwayStrategy();
break;
}
}
//上下文接口
public void ContextInterface()
{
strategy.AtWalk();
}
}
}
五、总结:
策略模式参与者:
Strategy 策略:定义所支持的算法的公共接口。Context使用这个接口来调用某个Strategy子对象定义的算法。
Strategy子对象具体策略:实现Strategy接口中的具体算法。
Context 上下文
1、 通过一个子对象来对其进行配置;
2、 维护一个对Strategy对象的引用;
3、 可定义一个接口来让Strategy访问它的数据。
六、案例推荐:
1、上班方式
2、空中飞行的东西
3、旅行的出动方式
4、彩票的出奖
5、超市的优惠方式
02、策略模式(Strategy)的更多相关文章
- 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)
在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...
- 【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成 ...
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...
- 设计模式 - 策略模式(Strategy Pattern) 具体解释
策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全 ...
- HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern)
策略模式(Strategy Pattern): 定义了了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户端. 第一个设计原则:找出应用中可能需要变化之处,把他们独立 ...
- 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)
原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...
- 反馈法学习设计模式(一)——策略模式Strategy Pattern
简介(Introduction) 之前学习Java8实战时,遇到一个很好的策略模式示例.便想着借着这个示例结合反馈式的方法来,学习策略设计模式,也以便后面反复琢磨学习. 首先我们通过练习,逐步写出符合 ...
- 策略模式 Strategy 政策Policy 行为型 设计模式(二十五)
策略模式 Strategy 与策略相关的常见词汇有:营销策略.折扣策略.教学策略.记忆策略.学习策略.... “策略”意味着分情况讨论,而不是一概而论 面对不同年龄段的人,面对不同的商品,必然将会 ...
- 策略模式-Strategy(Java实现)
策略模式-Strategy 在策略模式中,一个类(策略使用者)可以更改自己的执行策略. 比如以排序算法为例子, 多种排序算法都归属于排序算法, 但是实现的算法细节不同, 使用者可以很轻松地替换策略, ...
- [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型)
[.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模 ...
随机推荐
- python中pip添加国内镜像源后显著加速下载
python中pip添加国内镜像源后显著加速下载 更换pip源到国内镜像,很多国外的库下载非常慢,添加国内镜像后安装下载速度提升非常明显(亲测有些可以由几十kb加速到几MB) pip国内的一些镜像阿里 ...
- echarts折线图上下颜色渐变样式
// 折线图let lineChart = echarts.init(document.getElementById('lineChart'));let lineOption = { title: { ...
- 单词chalchiguite硬玉chalchiguite英语
翡翠在我国明确地称为硬玉(chalchiguite) ,可能始于宋代.19世纪后半叶,法国矿物学家德穆尔将中国的“玉”分为软玉和硬玉(见地质情报所:<翡翠冲的<国外地质科技>,198 ...
- 第1篇Scrum冲刺博客
目录 第1篇Scrum冲刺博客 各个成员在 Alpha 阶段认领的任务 各个成员的任务安排 整个项目预期的任务量 敏捷开发前的感想 团队期望 第1篇Scrum冲刺博客 各个成员在 Alpha 阶段认领 ...
- JSP 与Javabean 的交互技术
JSP 与Javabean 的交互技术 JavaBean的属性可以是任意类型,并且一个JavaBean可以有多个属性.每个属性通常都需要具有相应的setter. getter方法,setter方法称为 ...
- liteos队列(五)
1. 概述 队列又称消息队列,是一种常用于任务间通信的数据结构,实现了接收来自任务或中断的不固定长度的消息,并根据不同的接口选择传递消息是否存放在自己空间.任务能够从队列里面读取消息,当队列中的消息是 ...
- Python从零开始——函数
一:Python函数知识概览 二:函数的定义与调用 三:参数传递 四:函数返回值 五:匿名函数的定义与调用 六:变量作用域与改变变量作用域
- Linux /proc/$pid部分内容详解【转】
转自:https://www.cnblogs.com/likui360/p/6181927.html auxv /proc/[pid]/auxv包含传递给进程的ELF解释器信息,格式是每一项都是一个u ...
- 虚拟机中的jenkins无法访问&Nginx配置
虚拟机中安装了Gitlab,gitlab中也有nginx,导致端口冲突,用curl显示连接已被重置 一开始发现jenkins在本地可以访问,外网无法访问,本想通过nginx进行反代,实现访问,可是访问 ...
- constant timer(固定定时器),constant throughput timer(常数吞吐量定时器);多个请求,某个请求a下,设置常数吞吐量定时器,模式:all active threads(shared)则所有请求吞吐量一致;
1.两请求之间添加'固定定时器' 1000ms,那么两请求发送间隔时间是多少? 1000ms吗? 由实验得出,2个请求发送间隔时间 = 1000ms + 第一个请求时间(发出至完成后时间) 2.单个请 ...