一、概念:

策略是为达到某一目的而采取的手段或方法,策略模式的本质是目标与手段的分离,

手段不同而最终达成的目标一致。客户只关心目标而不在意具体的实现方法,

实现方法要根据具体的环境因素而变化。

二、案例思路

用我们每天上下班的方式来展开:

我们上下班的交通方式有:

  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)的更多相关文章

  1. 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)

    在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...

  2. 【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成 ...

  3. 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...

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

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

  5. HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern)

    策略模式(Strategy Pattern): 定义了了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户端. 第一个设计原则:找出应用中可能需要变化之处,把他们独立 ...

  6. 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)

    原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...

  7. 反馈法学习设计模式(一)——策略模式Strategy Pattern

    简介(Introduction) 之前学习Java8实战时,遇到一个很好的策略模式示例.便想着借着这个示例结合反馈式的方法来,学习策略设计模式,也以便后面反复琢磨学习. 首先我们通过练习,逐步写出符合 ...

  8. 策略模式 Strategy 政策Policy 行为型 设计模式(二十五)

    策略模式 Strategy   与策略相关的常见词汇有:营销策略.折扣策略.教学策略.记忆策略.学习策略.... “策略”意味着分情况讨论,而不是一概而论 面对不同年龄段的人,面对不同的商品,必然将会 ...

  9. 策略模式-Strategy(Java实现)

    策略模式-Strategy 在策略模式中,一个类(策略使用者)可以更改自己的执行策略. 比如以排序算法为例子, 多种排序算法都归属于排序算法, 但是实现的算法细节不同, 使用者可以很轻松地替换策略, ...

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

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

随机推荐

  1. deepin可视化程序打不开问题排查方法

    anyconnect是一个VPN软件,在deepin系统下安装完成之后,并不能够直接使用,点击启动图标之后没有反应. 要想分析问题,必须从命令行入手,错误会打印在控制台. 如何根据一个图标来找到一个程 ...

  2. Freemarker简单封装

    Freemarker是曾经很流行的一个模板库,它是一种通用的模板库,不仅仅可以用来渲染html. 模板可以分为两类: 只能生成特殊类型文件的模板,如jinja.django.Thymeleaf.jad ...

  3. git did not exit cleanly (exit code 1) 的解决办法

    问题描述: 关于Git的使用,在通常情况下,习惯于先在本地创建一个本地仓库,然后将项目提交到本地master,再将本地master中的项目Push 到远程仓库中,这样问题就来了. 具体错误信息如下: ...

  4. linux线程绑定cpu

    函数介绍 #define __USE_GNU #include <sched.h> void CPU_ZERO(cpu_set_t *set); void CPU_SET(int cpu, ...

  5. Selenium通过监听事件实现自动截图

    需要继承extends TestListenerAdapter这个类 代码如下package com.mushishi.selenium.util; import java.util.ArrayLis ...

  6. 服务器CPU很高,频繁FullGC排查小总结

    可以分为如下步骤: ①通过 top 命令查看 CPU 情况,如果 CPU 比较高,则通过 top -Hp 命令查看当前进程的各个线程运行情况. 找出 CPU 过高的线程之后,将其线程 id 转换为十六 ...

  7. odoo10学习笔记十一:视图综述

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/11189322.html 一:视图标签等公共结构 name (必选) 用于通过名字查找标签 model: 与v ...

  8. CentOS 7下简答搭建DNS服务器

    一.DNS相关介绍 DNS(Domain Name System)域名系统协议,作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用挨个记住IP地址.通过主机名,最终得到 ...

  9. packstack快速部署openstack

    环境准备 建议16GB RAM sed -i '/^SELINUX/s/enforcing/disabled/' /etc/selinux/config systemctl stop firewall ...

  10. 如何fork自己的github库?

    Github上我们经常fork其他人的代码,然后经过一通魔改后弄出"自己"的东西.但是现在我遇到了这么一个需求,就是我已经公开了一个自己的库(暂且叫parent),然后我想基于自己 ...