设计模式学习-Strategy策略模式

设计模式学习策略模式(Strategy Design Pattern) 设计模式策略模式,一种行为型模式 阅读详情

纸上得来终觉浅,看一遍没啥感觉。重新用C++写一遍有一点点感觉。记下来慢慢看,希望有更多感觉。。。

1、类说明

Duck 鸭子接口;

RedHeadDuck鸭子种类之一,继承于Duck

RubberDuck鸭子种类之一,继承于Duck


FlyBehavior 飞行行为类,

FlyWithWings 飞行行为之一,继承于FlyBehavior;

FlyNoWay 飞行行为之一,继承于FlyBehavior;


QuackBehavior 叫声行为类

Quack叫声行为之一,继承于QuackBehavior;

Squeak叫声行为之一,继承于QuackBehavior;

代码:

#include<iostream>

using namespace std;

//飞行行为类
class FlyBehavior
{
public:
	FlyBehavior::FlyBehavior()
	{
	}
	virtual void fly()
	{
	}
};

class FlyWithWings : public FlyBehavior
{
public:
	void fly()
	{
		cout << "我会飞..." <<endl;
	}
};

class FlyNoWay : public FlyBehavior
{
public:
	void fly()
	{
		cout << "我不会飞..." <<endl;
	}
};

//尖叫行为类
class QuackBehavior
{
public:
	virtual void quack()
	{
	}
};

class Quack : public QuackBehavior
{
public:
	void quack()
	{
		cout << "我会呱呱叫..." <<endl;
	}
};

class Squeak : public QuackBehavior
{
public:
	void quack()
	{
		cout << "我不会叫..." <<endl;
	}
};

//鸭子类
class Duck
{
public:

	FlyBehavior* flybehavior;
	QuackBehavior* quackBehavior;

	void performQuack()
	{
		quackBehavior->quack();
	}
	void performBehavior()
	{
		flybehavior->fly();
	}
	virtual void display() = 0;

};

class RedHeadDuck : public Duck
{
public:
	RedHeadDuck::RedHeadDuck()
	{
		flybehavior = new FlyWithWings();
		quackBehavior = new Quack();
	}
	void display()
	{
		cout << "我是红头鸭..." <<endl;
	}
	RedHeadDuck::~RedHeadDuck()
	{
		delete flybehavior;
		delete quackBehavior;
	}
};

class RubberDuck : public Duck
{
public:
	RubberDuck::RubberDuck()
	{
		flybehavior = new FlyNoWay();
		quackBehavior = new Squeak();
	}
	void display()
	{
		cout << "我是橡皮鸭..." <<endl;
	}
	RubberDuck::~RubberDuck()
	{
		delete flybehavior;
		delete quackBehavior;
	}
};

int main()
{
	Duck* duckA;
	duckA = new RedHeadDuck();
	duckA->display();
	duckA->performBehavior();
	duckA->performQuack();
	cout << "..............."<<endl;

	delete duckA;
	duckA = new RubberDuck();
	duckA->display();
	duckA->performBehavior();
	duckA->performQuack();
	getchar();
	return 0;
}

每个鸭子都有具体的行为方式,Duck有表现行为方法performQuack(),performBehavior(),具体的行为动作由FlyBehavior的子类的方法决定。

Duck的变量flybehavior和quackBehavior在不同的子类中指向不同的行为类型。使得子类成为具体行为模式的决定者。

策略模式:

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


《Head First 设计模式》

参考资料:http://www.cnblogs.com/wanggary/archive/2011/04/07/2008796.html


认真学习设计模式策略模式(Strategy Pattern) 【1】策略模式定义 策略模式定义和封装了一系列的算法,它们是可以相互替换的,也就是说它们具有共性,而它们的共性就体现在策略接口的行为上。另外为了达到最后一句话的目的,也就是说让算法独立于使用它的客户而独立变化,我们需要让客户端依赖于策略接口来实现。 策略模式特点: 是一种行为型模式,对算法封装,使得客户端独立于各个策略 扩展性强,添加策略无非就是添加一个具体的实现类而已,代价非常低 主要解决:... 阅读详情

相关推荐

设计模式学习笔记--策略模式Strategy Pattern)

设计模式第一弹,发现在继续深入学习Java相关知识前,很有必要学习设计模式,其中几个比较重要的设计模式其实在之前的使用中已经出现过很多次,但是由于没有学过设计模式,也就知其然不知其所以然的拿来用了,所以接下来准备好好整理学习设计模式,博客整理的内容均来自《Head First 设计模式》。下面开始整理第一个设计模式策略模式1.定义策略模式:定义了算法簇,分别封装起来,让它们之前可以互相替换,此模

classTC的博客 1278

设计模式学习--策略模式Strategy Pattern)

实现鸭子的行为(飞行类)@Override//实现鸭子飞行”);@Override//什么都不做,不会飞@Override”);实现鸭子的行为(呱呱叫)@Override//实现鸭子呱呱叫@Override//橡皮鸭子叽叽叫@Override// 什么都不做,不会叫整合鸭子的行为,让不同的鸭子继承鸭类(Duck)/**绿头鸭继承鸭类*//***///真正的呱呱叫//会用翅膀飞//我是一个真正的绿头鸭@Override!”);//红头鸭。

2401_84520118的博客 864

设计模式学习——策略模式Strategy Pattern)

0. 前言   最近在重构公司的一个项目的时候,在抽取DES加密重复部分代码的时候,突然间想起了策略模式,感觉策略模式好像可以应用上,于是重新学习了下策略模式。注:在DES加密中,有DES和TDES算法,其中又有各种分组模式,如EBC,CBC等。 1. 定义   引用百度定义:策略模式,定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它...

diaoxie6172的博客 144

设计模式学习--策略模式Strategy Pattern)(1)

愿你有一天,真爱自己,善待自己。《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

2401_84279169的博客 993

设计模式学习总结-策略模式Strategy Pattern)

设计模式学习总结-策略模式Strategy Pattern) 问题: 当我们定义一系列的算法,怎么能使得算法为应对不同的业务需要能自由的动态替换而又不影响到客户端的使用,并且算法的增减、修改都不会影响环境和客户端。 定义: 策略模式定义了一系列算法,把它们一个个封装起来,并且使它们可相互替换。该模式可使得算法能独立于使用它的客户而变化。 意图:  Strategy模式是行为模式,

香巴拉 708

学习设计模式-策略模式Strategy Pattern)

策略模式定义了算法族,分别封装起来,让他们之间相互替换,此模式让算法的变化独立与使用算法的客户良好的oo设计必须具备可复用,可扩充,可维护策略模式的使用场景:1.针对同一类型问题的多种处理方式,仅仅是具体行为有差别时; 2.需要安全地封装多种同一类型的操作时; 3.出现同一抽象类有多个子类,而又需要使用 if-else 或者 switch-case 来选择具体子类时。这个模式涉及到三个角色:环境(...

提莫达达的博客 214

设计模式学习--7.策略模式Strategy Pattern)

package com.designepattern.strategytest.v2; /** * @Author:glx * @Date:2020/12/9 * @Content: */ public class MainDemo { public static void main(String[] args) { Strategy s1=new StrategyImplA(); Context ctx1=new Context(s1);...

u010031813的博客 113

设计模式学习总结(一)策略模式Strategy Pattern

策略模式:定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 继承让所有的子类都有父类的行为,如果子类的行为经常改变,让所有的子类都有父类的行为是不恰当的。 接口解决了一部分问题,让实现了接口的子类才有这类行为,但是接口不具有实现代码,无法达到代码复用,因此当需要修改一个行为的时候,必须往下追踪每个定义次行为的类来修改,容易造成新的错误。

isskingdom的专栏 636

设计模式策略模式Strategy Pattern),与 java语言的多态有点像(重点学习

文章目录一、定义与特点1.1、定义1.2、优点:1.3、缺点:二、角色和UML类图2.1、主要角色如下:2.2、UML类图2.3、示例:2.3.1、Strategy2.3.2、ConcreteStrategyA2.3.3、ConcreteStrategyB2.3.4、ConcreteStrategyC2.3.5、Context:上下文的实现类2.3.6、Client三、鸭子项目示例3.1、需求:3...

猎人在吃肉 1143

设计模式学习总结:策略模式Strategy Pattern)

意图定义算法族,将它们分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于算法的客户。适用性 许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。 需用使用一个算法的不同变体 算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。则可以将相关的条件

m0_37979033的博客 269

设计模式-策略模式Strategy Pattern)学习总结

策略模式        定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。简单来说:我们星期天从学校去公园,有的步行过去,有的骑车过去,有的开车过去,有的做公交车过去;我们的出发点和目的地是一样的,只是过程不一样。使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种...

Infinite振 406

设计模式---策略模式

参考资料:https://www.runoob.com/design-pattern/strategy-pattern.html

u013165852的博客 146
上一篇: C++默认构造函数
下一篇: 设计模式学习-Observer观察者模式
我非英雄
博客等级 码龄16年 29粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值