Cocos2d-x中应用装饰者模式

Cocos2d-x中应用装饰者模式,第1张

概述装饰模式(Decorator Pattern) 以下情况使用Decorator模式 1. 需要扩展一个类的功能,或给一个类添加附加职责。 2. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销。 3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。 4. 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子 装饰者模式(Decorator Pattern)
以下情况使用Decorator模式
1. 需要扩展一个类的功能,或给一个类添加附加职责。
2. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销。
3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。

4. 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

上边是装饰者模式的应用,今天在做coco2d项目的时候使用了装饰者模式创建场景,觉得大多数的场景创建都适用这种模式。就拿菜单场景来举例,下面看代码

装饰模式头文件的代码:

主要实现了装饰模式需要的各种类。

#ifndef _MENulAYER_H#define _MENulAYER_H#pragma once#include <iostream>#include "cocos2d.h"#include "PlayGame.h"USING_NS_CC;//抽象的被装饰类class CComponet{public:	virtual voID Operation(Layer* pLayer) = 0;};//具体的被装饰类class CConcreteComponet :public CComponet{public:	voID Operation(Layer* pLayer){};};//抽象的装饰类class CDecorator :public CComponet{public:	CComponet* p;	voID setComponet(CComponet* that);	voID Operation(Layer* pLayer);};//具体的装饰类菜单class CConcreteDecoratorMenu :public CDecorator{public:	voID Operation(Layer* pLayer);};//具体的装饰类背景class CConcreteDecoratorBackGroud :public CDecorator{public:	voID Operation(Layer* pLayer);};#endif//_MENulAYER_H
cpp代码部分:

代码实现部分,两个装饰子类,一个菜单,一个背景。

#include "Menulayer.h"voID CDecorator:: setComponet(CComponet* that){	p = that;}voID CDecorator:: Operation(Layer* pLayer){	if (p != NulL)	{		p->Operation(pLayer);	}}voID CConcreteDecoratorMenu:: Operation(Layer* pLayer){	//调用父类中的接口	CDecorator::Operation(pLayer);	//添加自己的装饰	auto winSize = Director::getInstance()->getWinSize();	auto startItem = MenuItemImage::create(		"start_1.png","start_2.png",CC_CALLBACK_1(PlayGame::menuStartCallback,(PlayGame*)pLayer));	//startItem->setposition(Point(winSize.wIDth / 2,winSize.height / 2));	startItem->setposition(Point::ZERO);	startItem->setAnchorPoint(Point(0,0));	auto menu = Menu::create(startItem,NulL);	menu->setposition(Point::ZERO);	pLayer->addChild(menu,1);}voID CConcreteDecoratorBackGroud:: Operation(Layer* pLayer){	PlayGame* pPlayGameLayer = (PlayGame*)pLayer;	//调用父类中的接口	CDecorator::Operation(pLayer);	//添加自己的装饰	auto winSize = Director::getInstance()->getWinSize();	Sprite* pSprite = Sprite::create("playbg.png");	pPlayGameLayer->m_Sprite = pSprite;	pSprite->setposition(Point(pSprite->getContentSize().wIDth/2,pSprite->getContentSize().height / 2));	pLayer->addChild(pSprite,-1);}
场景类init函数部分代码:

在init中装饰了一个菜单

bool PlayGame:: init(){	if (!Layer::init())	{		return false;	}	//创建一个被装饰者对象	CConcreteComponet Aa;	//创建具体的装饰对象	CConcreteDecoratorMenu aA;//添加菜单装饰	//装饰是有序的,a->aA;	aA.setComponet(&Aa);	//最终aA执行的是二者结合的结果。	aA.Operation(this);}
菜单的calback函数代码:

按钮的回调函数中又给场景装饰了一个背景。

voID PlayGame::menuStartCallback(cocos2d::Ref* pSender){	//创建一个被装饰者对象	CConcreteComponet Aa;	CConcreteDecoratorBackGroud aB;//添加背景装饰	aB.setComponet(&Aa);	aB.Operation(this);	//this->m_Sprite->setposition(Point(50,50));}
这样把init中的把不同的功能的代码都移到了每个装饰子类中实现,降低耦合性。可以动态的给一个layer添加功能,这些功能可以再动态的撤销。可读性和可维护都有很大的提高。 总结

以上是内存溢出为你收集整理的Cocos2d-x中应用装饰者模式全部内容,希望文章能够帮你解决Cocos2d-x中应用装饰者模式所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1015869.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存