HEAD FIRST:策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

设计模式:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。本模式使得算法可独立于它的客户而变化。

大话设计模式:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

使用这个模式的原因:

用许多的算法对一类进行计算。那么如果把这些算法强行编码到这个类当中。其实是不可取的.因为很多时候下不同的情况下使用不同的算法。如果要添加新的算法也比较麻烦。如果一次性就包含了所有的算法那就很庞大了。

设计原则一:找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起.

这里变化的代码是说.各种可能会变化的Strategy.也就是一些行为或者算法.把会变化的部分取出来并“封装”起来,好让其他部分不受到影响。

设计原则二:针对接口编程:关键在于多态,执行时可以根据实际情况执行到真正的行为,不会被绑定到固定的行为上。通常来说,变量的声明类型一遍是抽象类或者接口。如此,只要是具体实现次超类型的类所产生的对象,都可以指定给这个声明的变量。也就是说。声明类的时候不需要理会以后执行时候对应的真正的类型对象。

设计原则三:多用组合 少用继承.

小理解:

Context中有一个Strategy的引用.他可以在Strategy的子类来实例化.也可以动态的改变..赋予某一个子类的实例.然后在Context中用一个方法来实现这个引用->Algorithminterface()...差不多就是这个意思...

如下:Duck类是 Context

然后FlyBehavior QuackBehavior是Strategy 类

在Duck类中的两个引用

FlyBehavior* flys;

 QuackBehavior *quas;

好吧~~基本明白了吧~~

 #include "stdafx.h"
#include<iostream>
using namespace std;
class FlyBehavior
{
public:
virtual void fly()=;
}; class QuackBehavior
{
public:
virtual void quack()=;
};
class guaguaQuack:public QuackBehavior
{
virtual void quack()
{
cout<<"guaguaQuack"<<endl;
}
};
class wangwangQuack:public QuackBehavior
{
virtual void quack()
{
cout<<"wangwangQuack"<<endl;
}
};
class noQuack:public QuackBehavior
{
virtual void quack()
{
cout<<"keepSilent"<<endl;
}
};
class CanFly:public FlyBehavior
{
virtual void fly()
{
cout<<"I can fly"<<endl;
}
};
class CannotFly:public FlyBehavior
{
virtual void fly()
{
cout<<"I cannot fly"<<endl;
}
}; class Duck
{
public:
FlyBehavior* flys;
QuackBehavior *quas;
virtual void display()=;
void setFlyBehavier(FlyBehavior *f)
{
flys = f;
}
void setQuackBehavior(QuackBehavior *q)
{
quas = q;
}
void performFly()
{
flys->fly();
}
void performQua()
{
quas->quack();
}
void performSwim()
{
cout<<"i can swim...all the ducks"<<endl;
}
}; class modelDuck:public Duck
{
public:
modelDuck()
{
flys = new CannotFly;
quas = new noQuack;
}
virtual void display()
{
cout<<"this is a model duck"<<endl;
}
}; int _tmain(int argc, _TCHAR* argv[])
{
Duck *d = new modelDuck;
d->display();
d->performFly();
d->setFlyBehavier(new CanFly);
d->performFly();
//d->performQua();
//d->performSwim();
return ;
}

head first 设计模式 策略模式的更多相关文章

  1. 15. 星际争霸之php设计模式--策略模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

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

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

  3. linkin大话设计模式--策略模式

    linkin大话设计模式--策略模式 Strategy [ˈstrætədʒi]  策略 策略模式用于封装系列的算法,这些算法通常被封装在一个称为Context的类中,客户端程序可以自由的选择任何一种 ...

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

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

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

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

  6. java设计模式 策略模式Strategy

    本章讲述java设计模式中,策略模式相关的知识点. 1.策略模式定义 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户.策略模式属于对象的 ...

  7. [Head First设计模式]策略模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  8. javascript 设计模式-----策略模式

    在<javascript设计模式>中,作者并没有向我们介绍策略模式,然而它却是一种在开发中十分常见的设计模式.最常见的就是当我们遇到一个复杂的表单验证的时候,常常需要编写一大段的if和el ...

  9. JAVA 设计模式 策略模式

    用途 Title 它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. 策略模式是一种行为型模式. 结构

  10. PHP设计模式-策略模式 转

    策略模式(Strategy Pattern) 策略模式是对象的行为模式,用意是对一组算法的封装.动态的选择需要的算法并使用. 策略模式指的是程序中涉及决策控制的一种模式.策略模式功能非常强大,因为这个 ...

随机推荐

  1. L107

    It is advisable to take an open- minded approach to new idea. 对新思想采取不存先入之见的态度是明智的.That said, the com ...

  2. CANopenSocket CANopenCGI.c hacking

    /**************************************************************************************** * CANopenS ...

  3. MySQL实战 | 02-MySQL 如何恢复到半个月内任意一秒的状态?

    原文链接:MySQL是如何做到可以恢复到任意一秒状态的? 看到这个题目是不是觉得数据库再也不用担心服务器 crash 了? 那我们需要学习为什么可以这么做?以及如何做? 即为什么可以恢复到任意时间点? ...

  4. CODE FESTIVAL 2017 qual A--B-fLIP(换种想法,暴力枚举)

    个人心得:开始拿着题目还是有点懵逼的,以前做过相同的,不过那是按一个位置行列全都反之,当时也是没有深究.现在在打比赛不得不 重新构思,后面一想把所有的状态都找出来,因为每次确定了已经按下的行和列后,按 ...

  5. Operating System-进程/线程内部通信-信号量、PV操作的实现和应用(解决哲学家进餐和生产者消费者问题)

    本文主要内容: 信号量的实现 利用信号量解决哲学家用餐问题 利用信号量解决生产者消费者问题 一.信号量的实现 1.1 信号量结构 typedef struct { int value; struct ...

  6. hl7 V2中Message Control ID的含义及应用

    HL7 v2中的MSH,MSA段都有Message Control ID. 有几点需要注意: 1.所有的MessageControlID必须唯一 2.对于MSH中的MessageControlID, ...

  7. bae3.0第二步 添加一个空的django项目

    1.创建django项目: 进入bae应用源码目录(appidd01iud80bg)执行django-admin.py startproject blog2.修改index.py的内容如下所示 #-* ...

  8. DCloud-MUI:HBuilder 安装

    ylbtech-DCloud-MUI:HBuilder 安装 1.返回顶部 1. 2. 3. 4. 2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   7.返 ...

  9. MyCAT 1.6 安装部署

    1 mycat 安装部署 1 下载解压Mycat-server-1.6-RELEASE-20161010173036-linux.tar.gz 到/usr/local/mycat 2 下载解压jdk- ...

  10. Ubuntu16.04+TensorFlow r1.12环境搭建指南

    一.操作系统安装 OS版本:Ubuntu 16.04 (ubuntu-16.04.5-server-amd64.iso) CPU:4Core以上 内存:4GB以上 磁盘空间:80G以上 二.基础环境准 ...