C#设计模式之1:策略模式
首先需要说明的是该系列的所有内容都是基于headfirst设计模式来描述的。因为我之前也看过不少关于设计模式的书,还是发现这本最好,因为这本书里面给出的例子是最贴切实际的。不说了,开始这个系列吧!
策略模式
设计原则①:找出应用中可能需要变化的地方,把他们独立出来,不要和那些不变的代码混合在一起。把会变化的部分提取出来,以便以后能够轻易的对这部分进行扩充或改动,而不会影响到不变的那部分代码。这样,代码变化引起的不经意后果变少,系统变得更有弹性。
设计原则②:针对接口编程,而不是针对实现进行编程。从现在开始,变化的部分被抽象到接口中,这样,鸭子就不用知道行为的具体实现了。
设计原则③:多用组合,少用继承。
策略模式定义:定义了算法族,分别封装起来,让他们之间可以互相替换。此模式让算法的变化独立于使用算法的客户。
背景:joe设计了一个鸭子游戏,这里面所有的鸭子都有一个基类,所有的鸭子都从这个基类来继承一致的行为,但是这样的设计忽略了一个重要的因素:变化。不是所有的子类都具有相似的行为,那这个世界也就不再精彩了。

下面是针对这个模式对鸭子游戏进行的设计:
public abstract class Duck
{
public string Color { get; set; }
public string Name { get; set; }//假设鸭子有一个名字
private IQuackable _quackable;
private IFlyable _flyable;
protected Duck(IQuackable quack,IFlyable fly)
{
_quackable = quack;
_flyable = fly;
}
public override string ToString()
{
return $"my name is {Name},i am {Color}";
}
public virtual void Swim()
{
Console.WriteLine("all duck can swim");
}
}
public interface IQuackable
{
void Quack();
}
public interface IFlyable
{
void Fly();
} public class ICanQuack : IQuackable
{
public void Quack()
{
Console.WriteLine("i can quack");
}
}
public class ICanFly:IFlyable
{
public void Fly()
{
Console.WriteLine("i can fly");
}
}
首先对鸭子设计了一个基类,这个基类是一个抽象类,所有其他的鸭子都会从这里继承。重要的是对鸭子的叫和飞这两种行为进行了抽离,做成了接口,因为不是所有的鸭子都会飞,也不是所有的鸭子都会叫。这样,我们在定义一个鸭子子类的时候,可以针对这种鸭子的特性进行编程。也就提高了系统的弹性。其中,将鸭子的一些行为独立出来这个符合上面提到的设计原则①,Duck类中针对的是两个接口来获取具体的行为这个符合设计原则②,将那两个接口作为Duck的字段符合设计原则③。
C#设计模式之1:策略模式的更多相关文章
- 【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成 ...
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...
- 《Head First 设计模式》[01] 策略模式
<Head First 设计模式>(点击查看详情) 1.写在前面的话 之前在列书单的时候,看网友对于设计模式的推荐里说,设计模式的书类别都大同小异,于是自己就选择了Head First系列 ...
- javascript设计模式--策略模式
javascript策略模式总结 1.什么是策略模式? 策略模式的定义是:定义一系列的算法,把他们独立封装起来,并且可以相互替换. 例如我们需要写一段代码来计算员工的奖金.当绩效为a时,奖金为工资的5 ...
- [head first 设计模式] 第一章 策略模式
[head first 设计模式] 第一章 策略模式 让我们先从一个简单的鸭子模拟器开始讲起. 假设有个简单的鸭子模拟器,游戏中会出现各种鸭子,此系统的原始设计如下,设计了一个鸭子超类,并让各种鸭子继 ...
- Python设计模式: 最佳的"策略"模式实践代码
Python设计模式: 最佳的"策略"模式实践代码 今天抽空看了下流畅的python,发现里面介绍了不少python自带的库的使用实例,用起来非常的优雅. 平时用Python来写爬 ...
- [设计模式] javascript 之 策略模式
策略模式说明 定义: 封装一系列的算法,使得他们之间可以相互替换,本模式使用算法独立于使用它的客户的变化. 说明:策略模式,是一种组织算法的模式,核心不在于算法,而在于组织一系列的算法,并且如何去使用 ...
- 设计模式:Strategy 策略模式 -- 行为型
设计模式 策略模式Strategy(对象行为型) 这是几年前写的文字(转载做的笔记更准确些),发觉还是废话多了点. 其实,核心就是5.结构中的UML图 5.1 和 5.2(新增).现在看这张图就觉得一 ...
- 设计模式浅谈----策略模式(c#及java实现)
一.何为策略模式 策略模式是行为型模式的一种,主要用于需要使用不同的算法来处理不同的数据对象时使用,是一种可以在运行时选择算法的设计模式.也称为政策模式. 主要解决:在有多种算法相似的情况下,使用 i ...
- JavaScript设计模式 Item 7 --策略模式Strategy
1.策略模式的定义 何为策略?比如我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路. 如果没有时间但是不在乎钱,可以选择坐飞机. 如果没有钱,可以选择坐大巴或者火车. 如果再穷一点,可以选 ...
随机推荐
- 强大而灵活的字体图标替代库iconfont
前言概述 在开发网页制作过程中通常需要一些网页小图标,前端需要PS切图,将单个小图标icon组合成CSS雪碧图过程中,需要一些时间和精力; 如果网页制作中需要的小图标icon有一套css框架库集 ...
- Python requests模块解析XML
检查QQ是否在线(api感觉不准) import requests from xml.etree import ElementTree qq_str = input('please input the ...
- mongoDB2.6,java使用具体解释
本文使用的环境是:win7_64+Eclipse+maven 一.准备工作 下载java驱动包 驱动包下载地址:http://mvnrepository.com/artifact/org.mongod ...
- WPF中修改DataGrid单元格值并保存
编辑DataGrid中的单元格的内容然后保存是非常常用的功能.主要涉及到的方法就是DataGrid的CellEditEnding 和BeginningEdit .其中BeginningEdit 是当 ...
- Oracle使用数据泵 (expdp/impdp)实施迁移
实验环境: 1.导出环境:RedHat6.4+Oracle 11.2.0.4.0,利用数据库自带的scott示例用户进行试验测试. Directory:wjq à /tmp/seiang_wjq 2. ...
- 根据JavaBean创建数据库的操作SQL
根据JavaBean创建数据库的操作SQL import java.lang.reflect.Field; public class GenerateSQL { public static void ...
- PHP json_encode 中文乱码
每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 在编码过程中.经常会用到json_encode来处理中文.但是.出现一个问题.中文 ...
- D. Zero Quantity Maximization(hash+map)
题意:就是让c=a*x+b,给你一个a[],b[],让你尽可能多的让c[]=0,输出有多少. 思路:直接令c=0,则x=-b/a, 也就是一条直线,通过这样就用hash值使相同的k值映射到一起,使用了 ...
- 在 C 代码中嵌入 Python 语句或使用 Python 模块 (Visual Studio 2013 环境设置)
1) 新建一个 内嵌 Python 语句的 C 代码, // This is a test for check insert the Python statements or module in C. ...
- day09--函数的定义分类以及其使用(1)
一.函数的定义以及分类: 什么是函数:函数是可以重复调用来完成特定功能的代码块.-----(重复利用的工具) """ 1 什么是函数?重复利用的工具————可以完成特定功 ...