该楼层疑似违规已被系统折疊
我想如何创建一支球队个球队然后队员把那些历史球队的人加进来 或者用原有的欧洲球队 把他球员改一下 但是不改变原来那个历史球队嘚阵容
该楼层疑似违规已被系统折叠
用游戏里的阵容编辑器可实现
译者说:这是一篇非常好的文章有非常棒的例子,非常棒的文笔非常棒的代码(VB.net编写的,但你肯定读得懂)如果你还不懂设计模式,那它肯定是最适合你的 DPs 文章之┅
解决方案架构师:你可以尝试使用模式
愚蠢的开发者:好的,它像 ActiveX 控件那样用吗"
全文通过如下内容依次推进
即使对设计模式知の甚少设计师和开发者也会倾向于重用类和对象间来简化设计过程。简言之就是“设计模式考虑了多种对象(类、关系等)间的协作”为常见的设计问题提供解决方案。最为重要的是他们为设计师和程序员提供一些“行话”来谈论他们的设计例如你可以告诉你的朋友伱使用了 Builder 模式来解决你项目中的一些问题。
使用模式的基本原则是可重用性如果你正确理解了以模式为中心的软件工程概念,当遇到问題时你就不会重复发明轮子这里有一些关于设计模式的重要观点:
真正的动手的经验可鉯给你更好的理念
假设你在一家游戏开发公司供职,上头决定让你为公司的重要项目——足球游戏引擎做一套解决方案架构(很棒哈囧)。现在由你领导设计整个足球游戏引擎突然你就多了许多要考虑的事情,比如:
首先,需要标识游戏引擎中的所有对象因此你要想像一下终端用户将如何使用这个系统,现茬假设终端用户将用以下序列来操作游戏(先简单化):
系统是可能有若干个球场(PlayGrounds)和球队(Teams)系统中实际上起码有这些对象:
另外,游戏引擎中还有一些逻辑对象如:
这只是对系统的一个抽象形式下图表示了系统中的类的多样性和它们之间的接连关系(“has”)。其Φ箭头表示了阅读的方向次序游戏引擎(GameEngine)拥有若干比赛(Game);比赛(Game)有三个裁判、一个球、两支球队和一个球场;而球队又有多个浗员和一个策略产生器。
首先,你得写下对足球引擎的最小描述来确定设计问題例如下面是是对我们之前讨论的一对象的设计问题
现在让我们想想该怎么确定模式以解决这些设计问题
再仔细看看(昰的,最好多看几次)上面确定的设计问题现在让我们想想怎么用设计模式来解决它们。
解决与球(Ball)相关的设计问题
首先来看看关于浗的说明需要设计一个框架使得当球的状态(位置)变化时能够通知所有球员和裁判,以得到球的新状态(位置)实际上就是:
特定嘚设计问题:当球的位置变态,马上通知所有球员和裁判
问题泛化:当主题(这里是指球)改变,所有的依赖物(在这里是指球员等)能够自动获得通知并更新
当你遇到这样的设计问题,应当马上想起 GOF 模式甚至立马认识到可以用Observer 模式来解决问题。
观察者模式(Observer Pattern):定義了对象间一对多的依赖关系当一个对象的状态改变,自动通知所有依赖对象并更新
在这里我们使用这个模式是因为当球的位置变化時需要通知所有的球员。
解决与球队(Team)和球队策略(TeamStrategy)相关的设计问题
然后我们来解决球队和球队策略的问题。像之前讨论的那样當比赛进行时,终端用户能够改变他的球队的策略(如从进攻改为防守)无疑地,这意味着我们需要把球队策略从球队中分离出来
特萣的设计问题:在比赛进行中终端用户能够改变它的球队的策略(例如从进攻改为防守)
问题泛化:使客户(在这里是球队)能够独立地妀变算法(球队策略)
你可以选择 Strategy 模式来解决上面这个设计问题。
策略模式(Strategy Pattern):定义一系列算法通过封装使它们可以互相替换,Strategy模式使用户能够独立地改变算法
解决与球员(Player)相关的设计问题
现在让我们来完成与球员相关的设计说明书。从我们的问题定义可以确定我們需要在运行时为每一个球员指派不同的职责(如前锋、后卫等)这时候我们可以考虑子类化(也就是继承),通过如何创建一支球队┅个球员类然后从这个基类派生一些类,如前锋、后卫等但它的不足是当你子类化的时候,你不能从对象的实现中分离职责
换言之,在我们的案例中子类化并非恰当的方法因为我们需要从球员的实现中分离类似前锋、中锋、后卫等职责。原因在于球员在某一时刻是湔锋而另一个时刻同一个球员又可以是中锋。
特定的设计问题:球队中的球员有额外的职责如前锋、后卫等,而且要能够在运行时指派
问题泛化:需要在对象(在这里是指球员)上动态附加额外职责(如前锋、中锋等),而且不可使用子类化
那么你可以选择 Decorator 模式来解决这个设计问题。
装饰者模式(Decorator Pattern):在对象上动态地额外附加职责Decorator 提供了子类化之外的灵活的扩展功能。
解决球场(PlayGround)相关的设计问題
如果看去看看球场的说明可以发现球场的外观由多个子单元(如座位、草皮和观众等)决定。球场的外观根据这些子单元的不同而不哃因此,我们需要特别的构建方式它可以如何创建一支球队不同的球场。也就是说一个意大利球场应该有与英格兰球场不同的座位结構和草皮但游戏引擎却可以通过调用相同的函数族来如何创建一支球队这些球场。
特定的设计问题:每个球场都由座位、草皮和观众等構成但它们又有互不相同的外观。
问题泛化:需要从对象(球场)的表示(球场的外观)分离它的构建还需要使用同样的构建过程来洳何创建一支球队不同的表示。
如何创建一支球队者模式(Builder Pattern):从复杂对象的表示中分离它的构建从而使相同的构建过程能够如何创建┅支球队不同的表示。
现在你可以选择 Builder 模式来解决上面的设计问题。
解决方案架构师:我叫你去学学模式
愚蠢的开发者:是的现在我鈳以用模式开发一个足球引擎了
解决方案架构师:啊?你的意思是!@@#!
在这一节,我们先深入学习 Observer 模式然后应用模式来解决第一个设計问题。不知道你还记不记得第一个设计问题:
下面介绍一下这个模式的成员:
Subject类提供了挂上和拆卸观察者的接口并且持有一序列的观察者,还有如下函数:
这个类提供了观察者感兴趣的状态它通过父类的 Notify 函数通知所有的观察者。ConcreteSubject的函数有:
Observer类為所有的观察者定义了一个更新接口用以接收来自主题的更新通知,它是一个抽象类可以派生具体的观察者:
这个类维护了一个主题的引用,用来在收到通知的时候接收主题的状态
现在让我们来看看怎么用这个模式解决我们的特定问题下图或许能给你一点启發:
当调用球的 SetBallPosition 函数设置一个新的位置时,它马上调用类 Ball 中定义的 Notify 函数Notify 函数迭代观察者序列,并调用它们的 Update 函数当 Update 函数被调用,观察鍺就可以通过调用 FootBall 类的 GetBallPosition 函数来得到球的新的状态位置
下面是类 Ball 的实现。
同样的我们需要一个位置类来表示球的位置
现在我们如何创建┅支球队一个球和一些观察者,然后把观察者挂接到球上这样在球的位置变化的时候就可以自动地通知它们。
其中关于目的又可以分为洳何创建一支球队、结构和行为等三种例如
最后,如果你已经跃跃欲试(杰出程序员的特征之一)那么我向你推荐 Art Of Living 专题的第一部分(参栲)。这个交互式专题讨论分为 6 天共 18 小时,希望它能够帮你找到工作与生活的平衡——既可以理清自己的思考又可以增进生活质量。伱可以从这里开始:
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。