head first 看了一遍,被面试时问我工厂模式,我发现我还是不记得,所以还是认认真真的看一遍吧,上一遍看的太快了,什么都没有记住。这一遍我会写下一些东西帮助自己记忆和理解,例子我也会用C#自己写一遍,所以感觉不错哦。

1:定义

策略模式:定义算法族,分别封装起来,让他们之间可以相互替换。

设计原则: 找到可能变化之处,把它们独立出来。

     针对接口编程,而不是针对实现编程

     多用组合,少用继承,行为是组合来的,而不是继承来的。

2:代码实现

C#源代码

鸭子飞的接口和动作实现

   public interface IFly
{
void fly();
}
    public class FlyWithWings : IFly
{
public void fly()
{
Console.WriteLine("I'm flying!!");
}
} public class FlyNoWay : IFly
{
public void fly()
{
Console.WriteLine("I cannot fly!!");
}
}

鸭子叫的接口和实现

   public interface IQuack
{
void quack();
}
//有声
public class Quack : IQuack
{
public void quack()
{
Console.WriteLine("Quack");
}
} //无声
public class MuteQuack : IQuack
{
public void quack()
{
Console.WriteLine("<< Silence>>");
}
} //吱吱声
public class Squeak : IQuack
{
public void quack()
{
Console.WriteLine("Squeak");
}
}

鸭子超类

public abstract class Duck
{
public IFly flyBehavior;
public IQuack quackBehavior;
public void performQuack()
{
quackBehavior.quack();
} public void performFly()
{
flyBehavior.fly();
} public void setFly(IFly flybehavior)
{
flyBehavior = flybehavior;
} public void setQuack(IQuack quackbehavior)
{
quackBehavior = quackbehavior;
} public void swim()
{
Console.WriteLine("all can swim");
} public abstract void display(); }

模型鸭子,继承鸭子

    public class ModelDuck : Duck
{
public ModelDuck()
{
flyBehavior = new FlyWithWings();
quackBehavior = new Squeak();
}
public override void display()
{
Console.WriteLine("I'm a model duck");
}
}

使用模型鸭子

            Duck model = new ModelDuck();
model.performFly();
model.performQuack();
model.setFly(new FlyNoWay());
model.performFly();
model.performQuack();

输出结果

head first (一):策略模式的更多相关文章

  1. javascript设计模式:策略模式

    前言 策略模式有效利用组合.委托.多态等技术和思想,可以有效避免多重条件选择语句. 策略模式对开放-封闭原则提供了很好的支持,将算法封装在strategy中,使得他们易于切换.理解.扩展. 策略模式中 ...

  2. StrategyPattern (策略模式)

    /** * 策略模式 * @author TMAC-J * 根据环境的不同选择不同的策略,把策略用接口抽象出来 */ public class StrategyPattern { interface ...

  3. JAVA 设计模式之策略模式

    定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换. 类型:行为类模式 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换.在前面说过 ...

  4. Java设计模式之策略模式(Strategy)

    前言: 最近一直在学习基于okHttp网络请求,学习的过程中就想起了之前项目中有这么一个需求不同的接口要采用不同的加密方式,比如登录之前要采用RSA加密,登录之后要采用AES加密,当时是采用靠传递一个 ...

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

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

  6. 《Head First 设计模式》之策略模式

    作者:Grey 原文地址:http://www.cnblogs.com/greyzeng/p/5915202.html 模式名称 策略模式(Strategy Pattern) 需求 模拟鸭子游戏,游戏 ...

  7. 学C#之设计模式系列笔记(1)策略模式

    一.借鉴说明 1.<Head First Design Patterns>(中文名<深入浅出设计模式>) 2.维基百科,策略模式,https://zh.wikipedia.or ...

  8. PHP 策略模式

    策略模式:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化.策略模式把对象本身和运算规则区分开来,其功能非常强大,因为这个设计模式本身的核心思想 ...

  9. php实现设计模式之 策略模式

    策略模式:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化.是一种行为模式. 策略模式包含三种角色 1 抽象策略角色: 策略类,通常由一个接口或 ...

  10. 设计模式-策略模式(Strategy Model)

    1.概述     在开发过程中常常会遇到类似问题,实现一个功能的时候往往有多种算法/方法(策略),我们可以根据环境的不同来使用不同的算法或策略来实现这一功能.     如在人物比较排序的实现中,我们有 ...

随机推荐

  1. 在vue-cli创建的项目里配置scss

    第一步,gitbash进入到项目目录 npm install node-sass --save-dev npm install sass-loader --save-dev 第二步:打开webpack ...

  2. systemtap如何写C函数 捎带着看看ret kprobe怎么用

    在systemstap中自定义函数 Embedded C can be the body of a script function. Instead enclosing the function bo ...

  3. SQL Server Profiler的简单使用,方便查找和发现SQL执行的效率和语句问题

    1 打开Server Profiler 2 去掉不必要的干扰,数据库的连接和断开之类的 3. 选择“显示所有列”,之后在列表中,勾选“DatabaseName”项. 4设置筛选器,这里设置只是过滤数据 ...

  4. 用 xampp 在ubuntu 下配置php 运行环境 lampp

      在linux下搭建php的运行环境,可以分别安装apache.mysql .php .phpmyadmin,也可以安装xampp(apache.mysql .php .phpmyadmin)集成包 ...

  5. JAVA 异常处理的认知学习过程

    没有异常处理 学生时代,我编写的java代码中,很少会有try catch.最主要的原因如下: 应用的规模很小 没有不确定因素 代码可控性高 如果规模小,往往就没有复杂的逻辑链路,整个软件的分层也很浅 ...

  6. 【BZOJ 3551】[ONTAK2010] Peaks加强版 Kruskal重构树+树上倍增+主席树

    这题真刺激...... I.关于Kruskal重构树,我只能开门了,不过补充一下那玩意还是一棵满二叉树.(看一下内容之前请先进门坐一坐) II.原来只是用树上倍增求Lca,但其实树上倍增是一种方法,L ...

  7. linux 条件判断式

    1.利用if ...then if [ 判断条件 ];then 指令 fi 实例一 Y/N: #!/bin/bash #Program: # This program shows "Hell ...

  8. Ecplise下设置jQuery和ExtJs自动提示

    Spket 1.6.23下载: http://yunpan.cn/cjJYmEcMFIuuN  访问密码 5642 ext jsb下载:http://yunpan.cn/cjJYR7ZTzibQn  ...

  9. Oracle SQL 疑难解析读书笔记(二、汇总和聚合数据)

    2.1 对某字段的值进行汇总 仅仅在两种特殊情况下,Oracle在聚合函数中考虑了NULL值.第一种是在GROUPING功能里,用来检验包含了NULL值的分析函数的结果,是直接由所在的表得来,还是由分 ...

  10. JAVASCRIPT和JSP计算闰年

    0x01:JAVASCRIPT 实现 <h1 align="left">求闰年</h1> 开始年份: <input type="text&q ...