策略模式是一种对象的行为型模式,定义一系列算法,并将每一个算法封装起来,并让它们可以相互替换。策略模式比算法独立于使用它的客户而变化,其目的是将行为和环境分隔,当出现新的行为时,只需要实现新的策略类。

优点:

1)另一种子类化方法。

2)在类自身中定义了每一个行为,这样就减少了条件语句。

3)更容易扩展模型。在不对应用程序进行代码修改的情况下,使该模式具有新的行为。

使用场景:

1)许多相关类只是在行为方面有所区别。

2)许多算法的不同变体。

3)算法使用客户端未知的数据。

Strategy 模式

public class Hand
{
public const int HANDVALUE_GUU = ;//石头
public const int HANDVALUE_CHO = ;//剪刀
public const int HANDVALUE_PAA = ;//布 private int handvalue;
private Hand(int handvalue)
{
this.handvalue = handvalue;
} public static Hand[] hands =
{
new Hand(HANDVALUE_GUU),
new Hand(HANDVALUE_CHO),
new Hand(HANDVALUE_PAA)
}; /// <summary>
/// 从值获得对象实例
/// </summary>
/// <param name="handvalue"></param>
/// <returns></returns>
public static Hand GetHand(int handvalue)
{
return hands[handvalue];
}
}
public interface Strategy
{
Hand NextHand();
}
public class WinningStrategy : Strategy
{
private bool won = false;
private Hand prevHand;
private Random random = new Random(); public Hand NextHand()
{
if (!won)
{
prevHand = Hand.GetHand(random.Next());
}
Console.WriteLine("调用了WinningStrategy策略");
return prevHand;
}
}
public class ProbStrategy : Strategy
{
public Hand NextHand()
{
int handvalue = ;
//省略具体实现 Console.WriteLine("调用了ProbStrategy策略");
return Hand.GetHand(handvalue);
}
}
public class Player
{
private string name;
private Strategy strategy;
public Player(string name, Strategy strategy)
{
this.name = name;
this.strategy = strategy;
} /// <summary>
/// 向战略请示手势
/// </summary>
/// <returns></returns>
public Hand NextHand()
{
return strategy.NextHand();
}
}
class Program
{
static void Main(string[] args)
{
//策略模式
while (true)
{
Console.WriteLine("/r/n请选择:1、WinningStrategy策略游戏;2、ProbStrategy策略游戏...");
string line = Console.ReadLine();
if (line.Equals(""))
{
Strategy.Strategy strategy = new WinningStrategy();
Player player = new Player("abc", strategy);
player.NextHand();
}
else if (line.Equals(""))
{
Strategy.Strategy strategy = new ProbStrategy();
Player player = new Player("abc", strategy);
player.NextHand();
}
}
}
}

23种设计模式之策略模式(Strategy)的更多相关文章

  1. 二十四种设计模式:策略模式(Strategy Pattern)

    策略模式(Strategy Pattern) 介绍定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例有一个Message实体类,对它的操作有 ...

  2. 【Unity3D与23种设计模式】策略模式(Strategy)

    GoF中定义: "定义一组算法,并封装每个算法,让它们之间可以彼此交换使用. 策略模式让这些算法在客户端使用它们时能更加独立." 游戏开发过程中 不同的角色会有不同的属性计算方法 ...

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

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

  4. java的23种设计模式之建造者模式

    场景和本质 场景 本质 案例 原理 应用场景 场景和本质 场景 我们要建造一个复杂的产品.比如:神州飞船,Iphone.这个复杂的产品的创建.有这样一个问题需要处理:装配这些子组件是不是有个步骤问题? ...

  5. 实践GoF的23种设计模式:建造者模式

    摘要:针对这种对象成员较多,创建对象逻辑较为繁琐的场景,非常适合使用建造者模式来进行优化. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:建造者模式>,作者: 元闰子. 简 ...

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

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

  7. JAVA设计模式之策略模式 - Strategy

    在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 ...

  8. 8.6 GOF设计模式四: 策略模式… Strategy Pattern

    策略模式… Strategy Pattern  在POS系统中,有时需要实行价格优惠, 该如何处理?  对普通客户或新客户报全价  对老客户统一折扣5%  对大客户统一折扣10%  注:课件 ...

  9. JAVA开发的23种设计模式之 --- 桥接模式

    桥接模式 概述:将抽象部分与他的实现部分分离,这样抽象化与实现化解耦,使他们可以独立的变化.如何实现解耦的呢,就是通过提供抽象化和实现化之间的桥接结构.    应用场景        实现系统可能有多 ...

随机推荐

  1. 编写高质量代码_改善C++程序的150个建议 读书笔记

    这几天看了下这本书<编写高质量代码_改善C++程序的150个建议>,觉的蛮有收获的,再次记录下自己以前不清晰的知识点,以供学习. 编写符合标准的main函数 C语言标准规定了main函数的 ...

  2. Unable to resolve target 'android-9'

    右键项目文件--->properties--->android  选择对应版本 保存 如还不生效 打开项目文件project.properties ,修改 target=android-1 ...

  3. 什么是REST设计风格

    https://zh.wikipedia.org/wiki/REST http://www.infoq.com/cn/articles/rest-introduction

  4. zabbix-agents客户端安装

    Windows下zabbix客户端的安装 记得关windows上的防火墙 1.首先需要下载zabbix_agents.rar文件 点击这里进行下载 当然也可以在www.zabbix.com进行下载 2 ...

  5. linux proc目录介绍

    https://www.cnblogs.com/DswCnblog/p/5780389.html

  6. 泛泰A870K去掉相机快门声音的方法

    首先ROOT手机,挂载读写,/system/media/audio/ui里面哈,把camera-click.ogg改成camera-click.ogg.bak就可以了 转载自:http://bbs.9 ...

  7. 关联Left Outer Join的第一条记录

    数据准备 CREATE TABLE person (person_id ), lastname )) / INSERT ALL INTO person (person_id, firstname, l ...

  8. Nginx: error while loading shared libraries: libpcre.so.1解决

    Shell代码 [root@tmsapp65 conf]# /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx: error while l ...

  9. 5 -- Hibernate的基本用法 --4 4 数据库方言

    Hibernate底层依然使用SQL语句来执行数据库操作,虽然所有关系数据库都支持使用标准SQL语句,但所有数据库都对标准SQL进行了一些扩展,所以在语法细节上存在一些差异.因此,Hibernate需 ...

  10. CentOS 6.4 SSH 免密码登录

    在配置apache集群分布时,要使用SSH免密码登录.假设现在有两台机器apache@svn(192.168.1.100)作为svn机,apache@app(192.168.1.101)作为app机. ...