【Unity与23种设计模式】装饰模式(Decorator)
GoF中定义:
“动态地附加额外的责任给一个对象。装饰模式提供了一个灵活的选择,让子类可以用来扩展功能。”
装饰模式一般用来增加新功能
它可以避免更改已经实现的程序代码
从而增加系统的稳定性,也变得更加灵活
装饰模式解决了C#不能多继承的问题
它通过从父类继承出一个不符合“类封装时的抽象定义”的子类
持有一个父类的对象
然后与要添加的功能组合
从而实现添加新功能的目标
//形状父类
public abstract class IShape {
public abstract void Draw();
public abstract string GetPolygon();
} //形状子类
public class Sphere : IShape {
public override void Draw()
{
Debug.Log("draw Sphere");
}
public override string GetPolygon()
{
return "Sphere多边形";
}
}
//“不符合类封装时的抽象定义”的子类
public abstract class IShapeDecorator : IShape {
IShape m_Component; public IShapeDecorator(IShape theComponent) {
m_Component = theComponent;
} public override void Draw()
{
m_Component.Draw();
}
public override string GetPolygon()
{
return m_Component.GetPolygon();
}
}
//能附加额外功能的类
public abstract class IAdditional {
public abstract void DrawOnShape(IShape theShape);
} public class Border : IAdditional {
public override void DrawOnShape(IShape theShape)
{
Debug.Log("draw Border");
}
}
//Border装饰者
public class BorderDecorator : IShapeDecorator {
Border m_Border = new Border(); public BorderDecorator(IShape theComponent) : base(theComponent) {} public override void Draw()
{
base.Draw();
m_Border.DrawOnShape(this);
}
public override string GetPolygon()
{
return base.GetPolygon();
}
}
//测试类
public class TestDecorator {
void UnitTest() {
Sphere theSphere = new Sphere();
BorderDecorator theSphereWithBorder = new BorderDecorator(theSphere);
theSphereWithBorder.Draw();
}
}
文章整理自书籍《设计模式与游戏完美开发》 菜升达 著
【Unity与23种设计模式】装饰模式(Decorator)的更多相关文章
- 【Unity与23种设计模式】解释器模式(Interpreter)
GoF中定义: "定义一个程序设计语言所需要的语句,并提供解释来解析(执行)该语言." 传统上,执行程序代码通常通过两种方式 第一种:编译程序 第二种:解释器 常见的使用解释器的程 ...
- 【Unity与23种设计模式】适配器模式(Adapter)
GoF中定义: "将一个类的接口转换成为客户端期待的类接口.适配器模式让原本接口不兼容的类能一起合作." 适配器模式与装饰模式有一定的相似之处 两者都是在着手解决C#不能多继承的问 ...
- 【Unity与23种设计模式】原型模式(Prototype)
GoF中定义: "使用原型对象来产生指定类的对象,所以产生对象时,是使用复制原型对象来完成." Unity中 开发者可以组装游戏对象 它可以包括复杂的组件 组装好了之后,就可以将其 ...
- 【Unity与23种设计模式】观察者模式(Observer)
GoF中定义: "在对象之间定义一个一对多的连接方法,当一个对象变换状态时,其他关联的对象都会自动收到通知." 现实中,社交网络就是个例子. 以前的报社,每次出新刊的时候, 报刊便 ...
- 【Unity与23种设计模式】命令模式(Command)
GoF中定义: "将请求封装成为对象,让你可以将客户端的不同请求参数化,并配合队列.记录.复原等方法来执行请求的操作." 实现命令模式的标准在于: 当请求被对象化后,对于请求对象是 ...
- 【Unity与23种设计模式】状态模式(State)
定义: "让一个对象的行为随着内部状态的改变而变化,而该对象也像是换了类一样" 应用场景: 角色AI:控制角色在不同状态下的AI行为 服务器连接状态:开始连线.连线中.断线等状态 ...
- 【Unity与23种设计模式】抽象工厂模式(Abstract Factory)
GoF中定义: "提供一个能够建立整个类群组或有关联的对象,而不必指明它们的具体类." 意思就是 根据不同的执行环境产生不同的抽象类子类 抽象工厂模式经常在面试中会涉及到 下面的例 ...
- 【Unity与23种设计模式】代理模式(Proxy)
GoF中定义: "提供一个代理者位置给一个对象,好让代理者可以控制存取这个对象." 代理模式多用来优化资源的加载 当资源已经加载过时,使用原来的资源 当资源没有加载过时,开始加载 ...
- 【Unity与23种设计模式】访问者模式(Visitor)
GoF中定义: "定义一个能够在一个对象结构中对于所有元素执行的操作.访问者让你可以定义一个新的操作,而不必更改到被操作元素的类接口." 暂时没有完全搞明白 直接上代码 //访问者 ...
随机推荐
- 来了解一下Mysql索引的相关知识:基础概念、性能影响、索引类型、创建原则、注意事项
索引的基础概念索引类似于书籍的目录,要想找到一本书的某个特定主题,需要先查找书的目录,定位对应的页码:存储引擎使用类似的方式进行数据查询,先去索引当中找到对应的值,然后根据匹配的索引找到对应的数据行 ...
- Python——文件操作详解
python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目 ...
- qml 静态编译程序执行错误 无法定位程序输入点 CreateDXGIFactory2 于动态链接库 dxgi.dll 上
重新编译 qt 静态库即可,或 删除该动态库. -no-feature-d3d12 解决方案请参考如下网址: https://forum.qt.io/topic/78380/entry-point-n ...
- qt 字符数组如何转换字符串?
char 字符数组如何转换成 QString? char source{1024} = {0}; QString des = QString::fromLocal8Bit(source);
- SpringBoot,Security4, redis共享session,分布式SESSION并发控制,同账号只能登录一次
由于集成了spring session ,redis 共享session,导致SpringSecurity单节点的session并发控制失效, springSession 号称 无缝整合httpses ...
- redis绑定ip以及启动和查看启动状态
改绑定ip: 或许是对redis的了解还不够多的缘故,单单只是从安装和启动来讲,个人觉得好像是比mongodb和mysql要简单一些. 我的安装包是这个:http://download.csdn.ne ...
- R语言︱分布函数与概率密度+随机数产生
1.常见概率分布 ##正态分布 pnorm(1.96) #P(x<=1.96)时的分布概率 pnorm(1.96,0,1) #上同 pnorm(1.96,lower.tail = F) #P(x ...
- VxWorks嵌入式系统几种常用的延时方法
1 taskDelay taskDelay(n)使调用该函数的任务延时n个tick(内核时钟周期).该任务在指定的时间内主动放弃CPU,除了taskDelay(0)专用 于任务调度(将CPU交 ...
- Windows 7 Visual Studio 2008配置OpenGL开发环境
Windows 7 Visual Studio 2008配置OpenGL开发环境 glut下载地址: http://www.opengl.org/resources/libraries/glut/gl ...
- Java导出防止小数显示不全工具类
1.说明 在做项目的过程中,发现导出功能中的数据显示不全,如"0.4",会显示成".4":"-0.8"会显示成"-.8" ...