- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
设计模式-面向对象设计原则
设计模式(2) 湖北汽车工业学院软件教研室 一、类(对象)的职责分配 面向对象的基石是类与对象,如何确定问题域中的类与对象? 类与对象是属性和服务的封装,服务体现了类与对象的职责。如何分配类与对象的职责呢?-GRASP(General Responsibility Assignment Software Patterns ),通用职责分配软件模式 Information Expert (信息专家) 如果某个类拥有完成某个职责所需要的所有信息,那么这个职责就应该分配给这个类来实现。这时,这个类就是相对于这个职责的信息专家。 例如:常见的网上商店里的购物车(ShopCar),需要让每种商品(SKU)只在购物车内出现一次,购买相同商品,只需要更新商品的数量即可。如下图: 比较商品是否相同的方法需要放到那里类里来实现呢?分析业务得知需要根据商品的编号(SKUID)来唯一区分商品,而商品编号是唯一存在于商品类里的,所以根据信息专家模式,应该把比较商品是否相同的方法放在商品类里。?? Creator (创造者) 如果一个类创建了另一个类,那么这两个类之间就有了耦合,产生了依赖关系。依赖或耦合带来的问题就是在以后的维护中会产生连锁反应,但必要的耦合是逃不掉的,我们能做的就是正确地创建耦合关系,不要随便建立类之间的依赖关系。 凡符合以下条件的情况,都应该由类A来创建类B,这时A是B的创建者: A是B的聚合 A是B的容器 A持有初始化B的信息(数据) A记录B的实例 A频繁使用B 例如:因为订单(Order)是商品(SKU)的容器,所以应该由订单来创建商品。如下图: Low coupling (低耦合) 低耦合意思就是要尽可能地减少类之间的连接。下面这些情况会造成类A、B之间的耦合: A是B的属性 A调用B的实例的方法 A的方法中引用了B,例如B是A方法的返回值或参数。 A是B的子类,或者A实现了B 低耦合降低了因一个类的变化而影响其他类的范围;低耦合使类更容易理解,因为类会变得简单,更内聚。 关于低耦合,有下面一些基本原则: a.?Don’t Talk to Strangers原则:不需要通信的两个对象之间,不要进行无谓的连接。 如果A已经和B有连接,如果分配A的职责给B不合适的话(违反信息专家模式),那么就把B的职责分配给A。 两个不同模块的内部类之间不能直接连接。 例如:Creator模式的例子里,实际业务中需要另一个出货人来清点订单(Order)上的商品(SKU),并计算出商品的总价,但是由于订单和商品之间的耦合已经存在了,那么把这个职责分配给订单更合适,这样可以降低耦合,以便降低系统的复杂性。如下图: High cohesion (高内聚) 功能性紧密相关的职责应该放在一个类里,并共同完成有限的功能,那么就是高内聚。这样更有利于类的理解和重用,也便于类的维护。 高内聚也可以说是一种隔离,每一个部分(类)都有自己独立的职责和特性,每一个部分内部发生了问题,也不会影响其他部分,因为高内聚的对象之间是隔离开的。 例如:一个订单数据存取类(OrderDAO),订单即可以保存为Excel模式,也可以保存到数据库中;那么,不同的职责最好由不同的类来实现,这样才是高内聚的设计,如下图: 这里把两种不同的数据存储功能分别放在两个类里来实现,如果未来保存到Excel的功能发生错误,那么检查OrderDAOExcel类就可以了。这使系统模块化,方便划分任务,比如这两个类就可以分配个不同的人同时进行开发,这样也提高了团队协作和开发进度。 Controller (控制器) 用来接收和处理系统事件的职责,一般应该分配给一个能够代表整个系统的类,这样的类通常被命名为“XX处理器”、“XX协调器”或者“XX会话”。 关于控制器类,有如下原则: a.?系统事件的接收与处理通常由一个高级类来代替。 b.?一个子系统会有很多控制器类,分别处理不同的事务。 Polymorphism (多态) 多态更符合高内聚和低耦合原则 例如:设计一个绘图程序,要支持可以画不同类型的图形。先定义一个抽象类Shape,让矩形(Rectangle)、圆形(Round)分别继承这个抽象类,并重写(override)Shape类里的Draw()方法,这样就可以使用同样的接口(Shape抽象类)绘制出不同的图形,如下图: Pure Fabrication (纯虚构) 高内聚低耦合,是系统设计的终极目标,但是内聚和耦合永远都是矛盾对立的。 高内聚会拆分出更多数量的类,但是对象之间需要协作来完成任务,这又造成了高耦合。 由一个纯虚构的类来协调内聚和耦合,可以在一定程度上解决上述问题。 例如:上面多态模式的例子,如果我们的绘图程序需要支持不同的系统,那么因为不同系统的API结构不同,
文档评论(0)