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.策略模式的定义 何为策略?比如我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路. 如果没有时间但是不在乎钱,可以选择坐飞机. 如果没有钱,可以选择坐大巴或者火车. 如果再穷一点,可以选 ...
随机推荐
- Mac轻量级服务器http-server
刚想跑个Vue页面,发现我本地没有应用服务器(Tomcat/IIS...) 于是想下载了Tomcat,才发现我没有装JDK,而Mac的JDK下得好久,都下不下来,想想算了. 于是在网上找个轻量级的服务 ...
- 面试----你可以手写一个promise吗
参考:https://www.jianshu.com/p/473cd754311f <!DOCTYPE html> <html> <head> <meta c ...
- dp 动态规划 蘑菇
蘑菇真的贵,友情价更高 Description 由于提莫为巡逻准备的蘑菇太多了,多余的蘑菇路上种不下,于是他精心挑选了一些蘑菇拜访他的好朋友小炮 提莫的蘑菇一共有n个,对于编号为i的蘑菇魔力值是a ...
- SpringBoot实现JWT保护前后端分离RESTful API
通常情况下, 将api直接暴露出来是非常危险的. 每一个api呼叫, 用户都应该附上额外的信息, 以供我们认证和授权. 而JWT是一种既能满足这样需求, 而又简单安全便捷的方法. 前端login获取J ...
- Python:Day21
序列化 我们把对象(变量)从内存中变成可存储或可传输的过程称之为序列化 json模块
- PHP交互数据库
教程 图形化界面访问自己的服务器上数据库 http://ip/phpmyadmin php文件 运行 <?php $servername = "localhost"; $us ...
- MongoDB的分片集群搭建
MongoDB的最为自豪的一个特色之一,分片. 参考官方文档: https://docs.mongodb.com/manual/sharding/ 单机压力,高频查询CPU,IO 单表压力,百万千万 ...
- VS2015/Visual Studio快捷键无效问题
0 VS2015快捷键无效问题的解决办法 快捷键的使用可以大大提高编码效率,VS为我们内置了不少的常用快捷键组合,实际使用过程中往往会随着计算机上安装其他软件引起快捷键冲突,导致VS快捷键失效,解决办 ...
- devops工具-Ansible基础
一.Ansible介绍 简介 Ansible使用Python语言开发,是一个配置管理型工具,与之类似的工具还有Puppet.SaltStack.chef等,默认通过SSH协议进行远程命令执行或 ...
- [翻译] 初看 ASP.NET Core 3.0 即将到来的变化
[翻译] 初看 ASP.NET Core 3.0 即将到来的变化 原文: A first look at changes coming in ASP.NET Core 3.0 在我们努力完成下一个 m ...