【设计模式】讨论汇总

下面关于设计模式的理解来自于多益网络18届游戏研发内部交流群,因为考虑到内容并没有涉及到公司的具体项目,都是对设计模式本身的理解,为了方便后面的学习回顾,特意整理汇总了一下。

1、你使用过什么设计模式,效果如何?

看过设计模式的相关书籍,但没有自己亲手用过,因此掌握的不好。到现在比较熟悉的是创建型的设计模式,对观察者模式和迭代器模式也有一些认识。

迭代器模式在C++的STL中比较常见,在项目中用的最多的就是单例模式和观察者模式了。在之前的一个项目中,需要将电子乐谱解析并绘制,需要加载一些固定的数据、资源,这个就可以使用单例模式实现,内存中只有一个实例能减少不少内存开销,最后是线程安全的内部静态变量方式实现,既能保证线程安全,又不会像饿汉模式哪有开始就加载占据内存。同时绘制乐谱模块和乐谱数据模块分开,乐谱数据更新通知绘制模块也更新,使用了观察者模式。

设计模式感觉得在实际项目中多使用,希望能够在以后的开发中多学多用。

2、为什么在学校很难用上设计模式?

大学做的项目工程,大多都是两三个人甚至只有自己在完成,这样就不怎么考虑到松耦合和 后续维护的问题,只求正确实现功能要求即可。

3、游戏公司用的比较多的设计模式有哪些?

单例模式,代理模式,工厂模式,组件模式,观察者模式这些

4、用设计模式有啥好处啊?不用不行吗?

其实用上设计模式就是为了方便后期维护和交接,所以需要各个部分比较独立,不要全互相依赖,不然后期改代码很费力。但设计模式也不能滥用,不同的部分要用合适的设计模式,反例就是有时用上设计模式会导致重复代码很多,比如策略模式的使用,在某种场景下,一个地图编辑器有不同的情况下的编辑状态,包括编辑状态,预览状态,保持状态,其中在这些状态里有相同方法,只是方法内部处理逻辑有点区别。那么可以把不同的状态对应成不同的策略,在不同状态下用对应的策略去处理。但在写不同的策略的时候,相同方法里面的重复代码可能就需要重复写一些了。

5、这样改起来不是很麻烦吗?

是的,如果都要改是会很麻烦,不过如果只是对某个策略进行修改,会比较明晰。

6、话说什么地方用哪种设计模式,应该怎么去把握呢?

这个其实是和需求场景有一定的关系的,比如在这样一个场景下,你要写按钮控件,那么对于这个按钮控件用什么设计模式好呢?已经知道按钮控件是有显示层和触摸层的。还有这个控件是要给很多项目用,这是一个公共控件。

按钮的事件传递是可以用观察者模式,那么按钮 本身呢?有一点不同项目需求会很坑爹,比如a项目会要按钮显示的时候是a效果,触摸支持click,b是要按钮显示的是b效果,触摸支持doubleclick。那么怎么保证项目可以很方便的按他们的要求来扩展按钮显示和触摸需求呢,把这两个独立出来就可以了,用组件模式。

平时可以先去了解每个设计模式使用那些场景,这样如果们恰好碰到类似的场景就可以考虑用这个设计模式。

7、策略模式和多态的区别在哪?感觉策略模式直接通过函数重载就能实现了,比如说上面说的地图编辑器,编辑状态定义为虚函数,预览状态,保持状态通过继承类来重载这个虚函数,感觉这样就已经实现了。我看网上的策略模式的例子也是差不多,感觉都是通过函数重载来实现的,是不是我没理解到策略模式的精髓。还有就是之前看原型模式的时候也有这种疑问,原型模式实现了一个原型接口,该接口用于创建当前对象的克隆。感觉C++中直接实现拷贝构造函数就是一样的功能了。。。所以我对设计模式还是有点疑问,分析系统架构的时候一开始是想不到用设计模式,可能是还没理解清楚,不知道为什么要用它。

对于策略模式和多态是有很多相似的地方,首先策略模式就是使用继承与多态来实现的,所以会有很多共同点,不过侧重点是有所不同的。比如说策略模式是同一个对象在不同情况下执行不同的方法(而这个方法是采用同一个接口,在不同策略类(多态)下实现的且共同继承于同一个父策略),而多态更多是指不同对象在调用同一个方法的时候实现不同,是一种高级特性以及是面向对象的核心思想。

用多态可以实现很多设计理念,可以有比较优的实现方式。或许可以这么说,用多态你可以实现一个比较丑的方法来满足一个需求,也可以有一个比较好的方式。设计模式我觉得就是对一种比较好的方式的总结。

比如,LOL里有很对个英雄每个英雄有不同的技能,不过接口都是相同的,都是技能qwer。可以怎么设计呢?

(1)提一个英雄父类出来,每个英雄实例继承这个父类,分别取重载实现qwer这四个技能。

(2)前面相同,不同的是我不在子类中重载实现,而是对qwer可以引用不同策略,策略类实际实现在外部写好,其中策略类也是通过多态形式实现。这两个哪个好呢?

如果出现这样一种模式,技能随机,那么第一种实现方式就GG了,第二种我通过动态更换策略就可以了。都是用的多态,不同的实现方式,表现出来的效果会有区别。

理解:LOL例子里面,第一种方式qwer是四个虚函数;第二种方式qwer是四个类对象(实现了技能这个接口),所以总结来说就是策略模式是通过将虚函数封装成接口,不同的策略就是通过实现这个接口的不同类。策略模式跟多态的区别就是策略模式将虚函数封装成了类。因此原型模式和拷贝构造函数也有类似的关系。这样使用设计模式的抽象程度会更高,实现了更高的隔离性,尽量去解耦合。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值