Design Pattern 设计模式1 - Strategy 1

实现 : Defferent Heros attack Defferently. - 不同的英雄使用不用的招数

Strategy设计的思路:

基类A,更加小的基类B,新的继承类C:

1 从基类A中抽出一个更加小的基类B

2 利用这个更加小的基类B实现不同的效果

3 把这个更加小的基类B包含进基类A中去

4 新的继承类C只需要和基类A打交道,设计不同行为,不需要理会更加小的基类B

#pragma once
#ifndef _STRATEGY_HEROS_H
#define _STRATEGY_HEROS_H

#include <stdio.h>

//Interface
class HeroAttack
{
public:
	virtual void attack() = 0;
};

//Base method class
class Laser : public HeroAttack
{
public:
	void attack()
	{
		puts("Super Eye-Laser");
	}
};

class Smash : public HeroAttack
{
public:
	void attack()
	{
		puts("I smash!");
	}
};

class WebWebWeb : public HeroAttack
{
public:
	void attack()
	{
		puts("Web, Web, Web!");
	}
};

//Base Class
class Hero_From_Marvel
{
	HeroAttack *heroAtt;
protected:
	void setAttackWay(HeroAttack *hat)
	{
		if (heroAtt) delete heroAtt;
		heroAtt = hat;
	}
public:
	Hero_From_Marvel() : heroAtt(nullptr)
	{
	}

	virtual ~Hero_From_Marvel()
	{
		if (heroAtt) delete heroAtt;
		heroAtt = nullptr;
	}

	void attack()
	{
		heroAtt->attack();
	}
};

//derived class
class SuperMan : public Hero_From_Marvel
{
public:
	SuperMan()
	{
		setAttackWay(new Laser);//这里不能使用malloc,否则内存冲突
	}
};

class Hulk : public Hero_From_Marvel
{
public:
	Hulk()
	{
		setAttackWay(new Smash);
	}
};

class SpiderMan : public Hero_From_Marvel
{
public:
	SpiderMan()
	{
		setAttackWay(new WebWebWeb);
	}
};

int StrategyHerosRun()
{
	const int HEROS = 3;
	Hero_From_Marvel *hfm[HEROS] = {new SuperMan, new Hulk, new SpiderMan};
	for (int i = 0; i < HEROS; i++)
	{
		hfm[i]->attack();
		delete hfm[i];
	}
	return 0;
}

#endif

Design Pattern 设计模式1 - Strategy 1,布布扣,bubuko.com

时间: 2024-11-05 16:24:55

Design Pattern 设计模式1 - Strategy 1的相关文章

Head First 之 Design Pattern(一):Strategy Pattern &amp;&amp; 初入设计模式殿堂

头一回阅读<Head First 设计模式>,感觉语言生动形象,把一个个抽象的模式描述的浅显易懂,就像白话文一样. 正如作者推荐如何使用这本书. 你懂Java吗(不太懂... 会C++不影响吧)? 你想学习.了解.记得并应用设计模式,以及其所基于的OO设计原则吗(是的,我正在深入学习C++呢)? 你是不是更喜欢一种轻松愉悦的学习环境(absolutely)? 这本书正是我需要的~   "Head First"就是那些不断学习的人们,像他们致敬,共勉加油~ 使用设计模式最好的

Design Pattern 设计模式 Decorator 装饰者模式

1 设计一个基类 2 继承这个基类,并包含这个基类的一个对象 3 创建继承类的时候,初始化这个基类,因为是基类指针,所以可以是所有基类的衍生类对象,那么就可以叠加任意多个衍生类对象了. 关键是在衍生类中包含一个基类对象,然后有了继承和包含两重关系,可以使得一个类一个类对象叠加,达到装饰目的. 等于是创建了一个对象指针链表,一个一个对象发挥其相应的作用. 下面程序装饰一个桌子,同时包含释放内存的处理. 关键要知道基类的析构函数必须使用虚函数,为什么? 1 如果基类不是析构函数,那么如果衍生类中包含

DP什么意思 design pattern 设计模式

DP  design pattern 大话设计模式  中的DP 是设计模式的意思 设计模式的书 ,最经典最原始的就是 GOF 的<设计模式>了. 设计模式的书基本上大多是以这 20 多个模式分开讲.含<大话设计模式> 学了 OOL 写的程序基本上是 OB 的. 只有慢慢掌握了 DP 才能写出真正的 OO 程序. 思想 -> 设计原则 -> DP -> OOD

[Design Pattern] 设计模式0_概述1

什么是设计模式 设计模式是前人对编程的总结. 在所谓前人栽树,后人乘凉,学习前人踩过的坑是提高自己编程实力的一个好途径. 为什么要学习设计模式 原因大致如下: * 让自己写出更加高内聚,松耦合的代码 * 让自己开发出"可维护,可拓展"的代码 * 让自己以后快速入门一个API * 学习Spring的必备前置技能 如何学习设计模式 学习设计模式不可避免必然是知道现在主流设计模式的来源和种类. 现在主流的设计模式有23种,来源于GOF. GoF是其实书籍<Design Patterns

Design Pattern设计模式

一.Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点     二.Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类.     三.Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类.     四.Builder,建造模式:将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示.   

设计模式之Strategy Pattern

Declaration 首先声明, 本篇blog的内容是参考Design pattern FAQ Part 3 ( Design pattern training series)这篇博文写的, 图片也是来自这篇博客. 部分是翻译, 加上自己的理解形成这篇博文. 希望和大家一起学习设计模式, 共同进步. Scene for Strategy Pattern Strategy Pattern,这个翻译成策略模式应该是没有问题的.策略模式希望做到的是在运行的情况下,根据对象的类型选择使用的算法.简单来

设计模式(Design pattern)概述

设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结, 使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性 设计框架 可复用面向对象软件系统一般划分为两大类:应用程序工具箱和框架(Framework) 我们平时开发的具体软件都是应用程序 而框架是构成一类特定软件可复用设计的一组相互协作的类 框架通常定义了应用体系的整体结构类和对象的关系等等设计参数,以便于具体应用实现者能集中精力于应用本身的特定细节. 框架主要记录软件应用中

简单工厂设计模式(Simple Factory Design Pattern)

[引言]最近在Youtub上面看到一个讲解.net设计模式的视频,其中作者的一个理解让我印象很深刻:所谓的设计模式其实就是运用面向对象编程的思想来解决平时代码中的紧耦合,低扩展的问题.另外一点比较有见解的是,区分了设计模式(Design Pattern),结构模式(Architecture Pattern),架构类型(Architecture Style). 如下图所示 Design Pattern:是基于代码层面的,就是针对解决功能模块之间的问题而采用恰当的设计模式,比如依赖注入,简单工厂,适

State Design Pattern 状态设计模式

设置好内部状态,然后根据不同的函数作为行为模式,进行状态转换. 有点像Finite Automata算法,两者的思想是一样的. 会Finite Automata,那么这个设计模式就很容易了. #pragma once #include <stdlib.h> #include <math.h> #include <random> #include <time.h> enum STATES { FULLY_RENTED, WAITING, GOT_APPLICA