设计模式精华总结(一)

 

单一职责,开放封闭,简单工厂,策略模式...



单一职责

就一个类而言,应该仅有一个引起它变化的原因,也就是说,一个类只有一个主要职责,如果你能想到多于一个动机去改变一个类,那么这个类就不复合单一职责原则。

举例:2048游戏



在2048这类悠闲游戏中(类似的还有俄罗斯方块,三消等),可以把地图数据相关的逻辑(如地图数据,合并逻辑等)封装在一个逻辑类中。界面相关的操作封装在一个界面类中。

附上本人移植的2048:

github:https://github.com/windfser/2048

游戏预览:http://www.3366.com/game/1000825.shtml

开放封闭

指对于软件实体(类,模块,函数等)应该可以扩展,但不可以修改。

意思就是说,对于扩展是开放的,对于更改是封闭的。对程序的改动是通过新增代码来进行的。

当然,这个过程不可能一蹴而就,我们可以秉着变化发生时就立即采取行动,进行抽象,每次变化一点点,整体实现这个思想。

举例:



简单工厂

简单工厂主要针对两个问题:

对于某一系列的对象

1)到底实例化哪种类型的对象

2)将来会不会增加要实例化的对象类型

我们可以写一个简单工厂类,统一从这个类的一个静态方法产生出我们要实例化的对象。通常,这些实例化的对象都是有相同的基类,方便多态应用。

优点是抽象功能便于复用(例如windows程序,web程序都可以用同一份逻辑)。扩展性维护性好(增加类型简单,修改容易)。

举例:

在本人的项目奔跑吧英雄中,地图会有多种事件:



这些事件对象便是通过简单工厂实例化而来。



策略模式

定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

策略模式的定义已经很浅显直白地告诉了我们什么事策略模式。一般来说,我们实现的策略(算法)有同样的基类和方法,方便组合。策略模式可以和简单工厂组合使用,由简单工厂产生算法的实例化对象。

举例:

例如在2016华为精英软件挑战赛中,初赛题目如下。



给定一个有向带权图,起始结点,终点以及毕竟点集,10秒内求出一条可行路径,Cost越少越好。

实际上我们可以根据图的规模,定义不同的策略。例如在结点较少的情况下,我们完全可以使用深度优先搜索+剪纸算法求出最优解。在结点较多的情况下,可以考虑智能算法,如蚁群算法。

我们可以把深搜和蚁群算法封装起来,继承自我们实现的Strategy基类。我们可以根据图规模实例化不同的算法对象,然后调用它们的共有方法getRoute()来获得路径结果。

部分内容参考自大话设计模式

WindJack

微信号:fengsserWind


    关注 风游


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册