装饰者模式(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中应用装饰者模式的更多相关文章

  1. osx – 在空白OS X故事板中创建应用场景

    我尝试传输一个现有的可可应用程序,以利用XCode6的OSX的新故事板.我添加了一个新的空白故事板文件,并将其设置为我的应用程序的主界面.但是,我不知道如何将我的NSApplication链接到这个故事板.当我使用故事板开始一个新项目时,我看到一个称为应用场景的场景.它包括应用程序,主菜单,AppDelegate…如何将应用对象添加到空白故事板?有什么类似的窗口控制器和视图控制器对象可以拖动在故事板上?

  2. 早期Swift中Cocos2D初始化代码的重构

    但是遗憾的是Swift2.2中还是不支持Type的class属性关键字,只能用static,我们期待Swift3的改进吧!

  3. Swift设计模式之装饰模式

    转自Swift设计模式原文Design-Patterns-In-Swift

  4. swift设计模式学习 - 装饰模式

    移动端访问不佳,请访问我的个人博客设计模式学习的demo地址,欢迎大家学习交流装饰模式在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。装饰模式的特点装饰对象和真实对象有相同的接口。

  5. Swift中where关键字的应用场景和用法

    Swift中where关键字的应用场景和用法

  6. 手把手教你swift项目添加cocos2dx-lua

    去倒杯水吧,这个过程会很久。。。至此,工程已经全部配置完毕,你已经解决一个大Boss了;今天就到这里吧,之后我们再续如何用swift调用lua手把手教你swift项目添加cocos2dx-lua

  7. 手把手教你swift项目集成cocos2dx-js模块

    前几天在swift项目中集成了Lua模块,使得在swift工程中用Lua写游戏逻辑成为了可能,具体工程及配置见手把手教你swift项目添加cocos2dx-lua,由于公司最近要把js做的小游戏集成到iOS原生应用中,于是我们将解锁另外一个场景,好了,下面开始;同样的,首先你得有一个swift项目我们从头开始,建立一个swift项目;我们默认你已经可以自己创建一个全新的swift项目了,这很简单,不是么?

  8. android – 尝试在Cocos2d-X C中设置一个带整数的CCLabelTTF作为它的字符串的一部分

    所以在使用Cocos2d的Objective-C中,我使用带有格式的NSMutableString将变量(得分)放入字符串中.我拿这个字符串并使用cclabel将它放在屏幕上.使用Cocos2D-x,我很难找到获得此结果的方法.一个简单的例子就是很棒.谢谢!

  9. php设计模式之装饰模式应用案例详解

    这篇文章主要介绍了php设计模式之装饰模式,结合具体应用案例形式详细分析了php装饰模式的概念、原理、用法及相关操作注意事项,需要的朋友可以参考下

  10. PHP面向对象程序设计组合模式与装饰模式详解

    这篇文章主要介绍了PHP面向对象程序设计组合模式与装饰模式,结合实例形式详细分析了php组合模式与装饰模式的定义、功能、使用方法与相关注意事项,需要的朋友可以参考下

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部