??xml version="1.0" encoding="utf-8" standalone="yes"?>
Class A wanna class B do what he want to (command). Simple way, invoke B's method, that's a good idea, but don't follow the OO principle: decouple
How to do it?
Firstly, B is a stable class; he can in charge of all his responsibility. Maybe there are too many classes like B that A wants to invoke. So how to do it, A composition or aggregation all classes that he needs? Of course not, too much dependence with A. So let’s think about this with OO principle: Encapsulate What Varies.
There are many unpredictable commands that are the variety in this case. We need to encapsulate the command and plugin to A. So at that time, A just knows he is invoking a command, and doesn’t know who and how to execute that command.
Secondly, how to plugin to A. I don’t wanna talk about DI or Java mechanism. I am handling C++, so just add a method named SetCommand(Command* pCommand) to A, that's fine.
Lastly, I showed a UML figure 1-1 that described all the means.
Figure 1-1
Everybody’ll shout: that is command pattern. Yes.
As the title said: we used but we didn't recognize. So let’s start with its official definition:
The Command Pattern encapsulate a request as an object, thereby letting you parameterize other objects with different request, queue or log requests, and support undoable operations.
关于q篇文章我一直想写,但每ơL没有一个闲下来的时_(d)现在试着挤每天的闲暇旉一点点完成?/span>
一直以来我都想做一个Y件架构师Q所以我在^时的开发中除了(jin)保证写出高质量的代码外,q会(x)从架构者的角度来仔l推敲整个应用。当然了(jin)q个架构主要是指的代码的架构Q那么推敲的依据主要来自三个地方Q?/span>
1Q?/span>GRASP
每当遇到软g分层Q类g业务逻辑攑֜那个cd个层{问题时Q我通常都会(x)参?/span>GRASPQ?/span>General Responsibility Assignment Software Pattern。包括以下几个原则:(x)
AQ?/span>Information Expert 信息专家
BQ?/span>Creator 创徏?/span>
CQ?/span>Low Coupling 低耦合
DQ?/span>High Cohesion 高内?/span>
EQ?/span>Controller 控制?/span>
FQ?/span>Polymorphism 多?/span>
GQ?/span>Pure Fabrication U虚?/span>
HQ?/span>Indirection 间接Q避免对象间直接耦合Q合理分配职?/span>
GQ?/span>Protected Variations 受保护变化:(x)开闭原则?/span>
虽说每个思想懂,但真正能用在实际开发中q是有一定难度的Q具体的介绍可以参考大?/span>CRAIG LARMAN的?/span>UML与模式应用》?/span>
2Q?/span>Design Patterns
古hl剑分三层境界。第一层是每个招式都熟C?/span>, 没事拿出来l练Q比武时按照自己的套路出剑,W二层就是没有招式,只有思想Q假如想解掉别h的剑Q那目标是解剑Q随便出剑都可以做到。第三层是人剑合一Q这U境界就已经不依赖与剑了(jin)Qn边的M物体包括自己都可以是一把剑Q都可以|对方于d?/span>
世间万物皆相通,我认为模式的学习(fn)也是有三U阶D,23U模式熟C?j),遇到具体目套相对应的设计模式,虽然有点LQ但lY件的l护和扩展带来很大好处,q是学习(fn)设计模式的第一层。第二层是大脑中已l没有具体的模式Q只知道如果要解耦,那么p样做Q如果追求运行速度Q就那样做,q就不一定是23U模式的一U了(jin)。如果已l有前两层的功力Q那pq求计模式合一Q这时就有很多变化,创造模式,不会(x)依赖与语a(C, C++, JAVA{等)Q各个领域的设计模式{等。估?/span>Erich Gamma应该C(jin)W三层境界了(jin)吧?/span>
3. 我的前辈
他们在这斚w很有l验Q架构这个东西就是^时要U篏丰富目l验Q看看国外的一个个大牛Q都不是40多岁的hQ所以我很讨厌某些a软g是吃青春饭的…
在正常的情况Q在我看来,现在的Y件设计从大的角度来讲是复用Q?/span>ReuseQ,从小的角度来讲就是解?/span>(Decouple或?/span>separate concern)。作Z名优U的程序员Q开发一?/span>AppQ写一句代码都要考虑C写的q个cM其它cȝ关系Q是不是多余的依赖,适不适合扩展{等。由于这D|间工作的需要,我接q{?jin)三个项目,目睹了(jin)每个项目架构的优缺点,加之前不久我又进行?jin)IJC关于RUP的培训,?/span>IJC?/span>David和蒋胜老师深入的讨Z(jin)软g开发过E,所以我x学到的一些设计方法D个例子来说明?/span>
在进入主题之前我惛_叙述一些概c(din)?/span>
概念1Q由面向q程到面向对象绝Ҏ(gu)一个质的飞跃,我认?/span>OO最大的优点在于它的E序设计和现实世界是相对应的Q从23U设计模式的名字上面也有体现。工厂,代理Q适配器等{?/span>
概念2Q?/span>MVCQ?/span>Model-View-ControllerQ模?/span>?/span>视图?/span>控制器模式)(j)用于表示一UY件架构模式。它把Y件系l分Z个基本部分:(x)模型Q英?/span>:ModelQ,视图Q?/span>ViewQ和控制Q?/span>ControllerQ?/span>视图(View)代表用户交互界面Q控?/span>(Controller)可以理解模型与视图匚w在一P共同完成用户的请求。模型主要是指业务流E的具体l节Q整个过E如?/span>1。那么其实在实际的开发中MVCq是有很多局限性的Q后面会(x)通过一个例子给Z个我的改q版?/span>
?/span>1
概念3Q?/span>RUP
RUPQ?/span>Rational Unified ProcessQ统一软g开发过E,l一软gq程)是一个面向对象且Z|络的程序开发方法论。根?/span>Rational(Rational Rose和统一建模语言的开发?/span>)的说法,好像一个在U的指导者,它可以ؓ(f)所有方面和层次的程序开发提供指导方针,模版以及(qing)事例支持?/span> RUP和类似的产品--例如面向对象的Y件过E(OOSPQ,以及(qing)OPEN Process都是理解性的软g工程工具--把开发中面向q程的方面(例如定义的阶D,技术和实践Q和其他开发的lgQ例如文,模型Q手册以?qing)代码等{)(j)整合在一个统一的框架内?/span>
抓其_N是使整个开发过E统一Q可理。用例驱动,以架构ؓ(f)中心(j)Q增量与q代Q是RUP的主要思想?/span>RUP是一个很复杂的过E,但好在它在每个项目中使用时可以因地制宜,有效的裁减可以RUP在工E中发挥最大的威力。作Z个程序员Q我首先要关?j)的是有关代码架构的问题Q?/span>RUP有一个核?j)的思想Separate concernQ也是分离x炏V这也刚好体C(jin)面向对象的一个思想Q解耦。那?/span>RUP中最能体现它Separate concern的应该就它?/span>Minimal?/span>Extension?jin),当然q有一些其它的体现方式Q我?x)在下篇实例中详l介l?/span>
单来?/span>Minimal指的是那些上不依赖于表现层,下不依赖于数据库Q操作系l等,可以在Q何环境下q行的纯业务逻辑E序Q最主要的还?/span>Minimal部分的代码可以复用?/span>Extension包括MinimalQ它依赖于某个特定的底层E序或者操作系l?/span>Minimal?/span>ExtensioncM于图2的关pR?br>
?