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) 策略模式是对象的行为模式,用意是对一组算法的封装.动态的选择需要的算法并使用. 策略模式指的是程序中涉及决策控制的一种模式.策略模式功能非常强大,因为这个 ...
随机推荐
- LeetCode OJ:Path Sum II(路径和II)
Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...
- 信息标记 以及信息提取--xml-json-yaml
1 信息标记的三种方式: XML: JSON: YAML: 1 缩进 表示所属关系: 2 - 表示并列关系: 3 | 表示整块数据: HTML----XML的一种形式: 2 信息提取的方法: ...
- MFC获得当前应用程序目录的GetCurrentDirectory()和GetModuleFileName()函数
在 开发过程中经常需要获得程序当前的运行目录,这时就可以使用GetCurrentDirectory()和GetModuleFileName()函 数,GetCurrentDirectory只是返回当前 ...
- BZOJ- 3142:数列 (数学)
题意:给出N,K,M,P.求有多少长度为K的序列A,满足:(1)首项为正整数:(2)递增数列:(3)相邻两项的差小于等于m:(4)最后一个数小于等于N. 思路:根据差分来算数量. #include&l ...
- JSONP原理及实现跨域方式
今天做页面时,后台给了个接口:https://a.a.com/a/a.json,我页面的上线地址是:http://b.b.com.显而易见,因为浏览器同源策略的限制,通过ajax无法无法取得json的 ...
- QT:QString、QByteArray和char *的转换 【转载】
原文网址:http://blog.csdn.net/light1028/article/details/7899541 第一种,数据流的方式,这里只说从QByteArray转向QString. QBy ...
- 6、Selenium+Python登录案例 -- Github
一:登录 1.指定浏览器,打开网址:https://github.com/login 2.设置等待时间: time.sleep(3) or driver.implicitly_wait(3) 3.输入 ...
- hl7 V2中Message Control ID的含义及应用
HL7 v2中的MSH,MSA段都有Message Control ID. 有几点需要注意: 1.所有的MessageControlID必须唯一 2.对于MSH中的MessageControlID, ...
- 蓝桥杯 基础练习 BASIC-14 时间转换
基础练习 时间转换 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个以秒为单位的时间t,要求用“<H>:<M>:<S>”的格式来表示这个时间 ...
- XSS自动化检测 Fiddler Watcher & x5s & ccXSScan 初识
一.标题:XSS 自动化检测 Fiddler Watcher & x5s & ccXSScan 初识 automated XSS testing assistant 二.引言 ...