head first 设计模式 策略模式
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 设计模式 策略模式的更多相关文章
- 15. 星际争霸之php设计模式--策略模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- [.net 面向对象程序设计深入](24)实战设计模式——策略模式(行为型)
[.net 面向对象程序设计深入](24)实战设计模式——策略模式(行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它 ...
- linkin大话设计模式--策略模式
linkin大话设计模式--策略模式 Strategy [ˈstrætədʒi] 策略 策略模式用于封装系列的算法,这些算法通常被封装在一个称为Context的类中,客户端程序可以自由的选择任何一种 ...
- [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型)
[.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模 ...
- 设计模式-策略模式(Strategy Model)
1.概述 在开发过程中常常会遇到类似问题,实现一个功能的时候往往有多种算法/方法(策略),我们可以根据环境的不同来使用不同的算法或策略来实现这一功能. 如在人物比较排序的实现中,我们有 ...
- java设计模式 策略模式Strategy
本章讲述java设计模式中,策略模式相关的知识点. 1.策略模式定义 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户.策略模式属于对象的 ...
- [Head First设计模式]策略模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- javascript 设计模式-----策略模式
在<javascript设计模式>中,作者并没有向我们介绍策略模式,然而它却是一种在开发中十分常见的设计模式.最常见的就是当我们遇到一个复杂的表单验证的时候,常常需要编写一大段的if和el ...
- JAVA 设计模式 策略模式
用途 Title 它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. 策略模式是一种行为型模式. 结构
- PHP设计模式-策略模式 转
策略模式(Strategy Pattern) 策略模式是对象的行为模式,用意是对一组算法的封装.动态的选择需要的算法并使用. 策略模式指的是程序中涉及决策控制的一种模式.策略模式功能非常强大,因为这个 ...
随机推荐
- L107
It is advisable to take an open- minded approach to new idea. 对新思想采取不存先入之见的态度是明智的.That said, the com ...
- CANopenSocket CANopenCGI.c hacking
/**************************************************************************************** * CANopenS ...
- MySQL实战 | 02-MySQL 如何恢复到半个月内任意一秒的状态?
原文链接:MySQL是如何做到可以恢复到任意一秒状态的? 看到这个题目是不是觉得数据库再也不用担心服务器 crash 了? 那我们需要学习为什么可以这么做?以及如何做? 即为什么可以恢复到任意时间点? ...
- CODE FESTIVAL 2017 qual A--B-fLIP(换种想法,暴力枚举)
个人心得:开始拿着题目还是有点懵逼的,以前做过相同的,不过那是按一个位置行列全都反之,当时也是没有深究.现在在打比赛不得不 重新构思,后面一想把所有的状态都找出来,因为每次确定了已经按下的行和列后,按 ...
- Operating System-进程/线程内部通信-信号量、PV操作的实现和应用(解决哲学家进餐和生产者消费者问题)
本文主要内容: 信号量的实现 利用信号量解决哲学家用餐问题 利用信号量解决生产者消费者问题 一.信号量的实现 1.1 信号量结构 typedef struct { int value; struct ...
- hl7 V2中Message Control ID的含义及应用
HL7 v2中的MSH,MSA段都有Message Control ID. 有几点需要注意: 1.所有的MessageControlID必须唯一 2.对于MSH中的MessageControlID, ...
- bae3.0第二步 添加一个空的django项目
1.创建django项目: 进入bae应用源码目录(appidd01iud80bg)执行django-admin.py startproject blog2.修改index.py的内容如下所示 #-* ...
- DCloud-MUI:HBuilder 安装
ylbtech-DCloud-MUI:HBuilder 安装 1.返回顶部 1. 2. 3. 4. 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 7.返 ...
- MyCAT 1.6 安装部署
1 mycat 安装部署 1 下载解压Mycat-server-1.6-RELEASE-20161010173036-linux.tar.gz 到/usr/local/mycat 2 下载解压jdk- ...
- Ubuntu16.04+TensorFlow r1.12环境搭建指南
一.操作系统安装 OS版本:Ubuntu 16.04 (ubuntu-16.04.5-server-amd64.iso) CPU:4Core以上 内存:4GB以上 磁盘空间:80G以上 二.基础环境准 ...