设计模式02-面向对象设计原则.ppt
《设计模式02-面向对象设计原则.ppt》由会员分享,可在线阅读,更多相关《设计模式02-面向对象设计原则.ppt(69页珍藏版)》请在三一办公上搜索。
1、设计模式(2),湖北汽车工业学院软件教研室,一、类(对象)的职责分配,面向对象的基石是类与对象,如何确定问题域中的类与对象?类与对象是属性和服务的封装,服务体现了类与对象的职责。如何分配类与对象的职责呢?-GRASP(General Responsibility Assignment Software Patterns),通用职责分配软件模式,Information Expert(信息专家)如果某个类拥有完成某个职责所需要的所有信息,那么这个职责就应该分配给这个类来实现。这时,这个类就是相对于这个职责的信息专家。例如:常见的网上商店里的购物车(ShopCar),需要让每种商品(SKU)只在购物
2、车内出现一次,购买相同商品,只需要更新商品的数量即可。如下图:,比较商品是否相同的方法需要放到那里类里来实现呢?分析业务得知需要根据商品的编号(SKUID)来唯一区分商品,而商品编号是唯一存在于商品类里的,所以根据信息专家模式,应该把比较商品是否相同的方法放在商品类里。,Creator(创造者)如果一个类创建了另一个类,那么这两个类之间就有了耦合,产生了依赖关系。依赖或耦合带来的问题就是在以后的维护中会产生连锁反应,但必要的耦合是逃不掉的,我们能做的就是正确地创建耦合关系,不要随便建立类之间的依赖关系。凡符合以下条件的情况,都应该由类来创建类,这时是的创建者:是的聚合是的容器持有初始化的信息(
3、数据)记录的实例频繁使用,例如:因为订单(Order)是商品(SKU)的容器,所以应该由订单来创建商品。如下图:,Low coupling(低耦合)低耦合意思就是要尽可能地减少类之间的连接。下面这些情况会造成类A、B之间的耦合:A是B的属性 A调用B的实例的方法 A的方法中引用了B,例如B是A方法的返回值或参数。A是B的子类,或者A实现了B低耦合降低了因一个类的变化而影响其他类的范围;低耦合使类更容易理解,因为类会变得简单,更内聚。,关于低耦合,有下面一些基本原则:a.Dont Talk to Strangers原则:不需要通信的两个对象之间,不要进行无谓的连接。如果A已经和B有连接,如果分配
4、A的职责给B不合适的话(违反信息专家模式),那么就把B的职责分配给A。两个不同模块的内部类之间不能直接连接。,例如:Creator模式的例子里,实际业务中需要另一个出货人来清点订单(Order)上的商品(SKU),并计算出商品的总价,但是由于订单和商品之间的耦合已经存在了,那么把这个职责分配给订单更合适,这样可以降低耦合,以便降低系统的复杂性。如下图:,High cohesion(高内聚)功能性紧密相关的职责应该放在一个类里,并共同完成有限的功能,那么就是高内聚。这样更有利于类的理解和重用,也便于类的维护。高内聚也可以说是一种隔离,每一个部分(类)都有自己独立的职责和特性,每一个部分内部发生了
5、问题,也不会影响其他部分,因为高内聚的对象之间是隔离开的。例如:一个订单数据存取类(OrderDAO),订单即可以保存为Excel模式,也可以保存到数据库中;那么,不同的职责最好由不同的类来实现,这样才是高内聚的设计,如下图:,这里把两种不同的数据存储功能分别放在两个类里来实现,如果未来保存到Excel的功能发生错误,那么检查OrderDAOExcel类就可以了。这使系统模块化,方便划分任务,比如这两个类就可以分配个不同的人同时进行开发,这样也提高了团队协作和开发进度。,Controller(控制器)用来接收和处理系统事件的职责,一般应该分配给一个能够代表整个系统的类,这样的类通常被命名为“X
6、X处理器”、“XX协调器”或者“XX会话”。关于控制器类,有如下原则:a.系统事件的接收与处理通常由一个高级类来代替。b.一个子系统会有很多控制器类,分别处理不同的事务。,Polymorphism(多态)多态更符合高内聚和低耦合原则例如:设计一个绘图程序,要支持可以画不同类型的图形。先定义一个抽象类Shape,让矩形(Rectangle)、圆形(Round)分别继承这个抽象类,并重写(override)Shape类里的Draw()方法,这样就可以使用同样的接口(Shape抽象类)绘制出不同的图形,如下图:,Pure Fabrication(纯虚构)高内聚低耦合,是系统设计的终极目标,但是内聚和
7、耦合永远都是矛盾对立的。高内聚会拆分出更多数量的类,但是对象之间需要协作来完成任务,这又造成了高耦合。由一个纯虚构的类来协调内聚和耦合,可以在一定程度上解决上述问题。例如:上面多态模式的例子,如果我们的绘图程序需要支持不同的系统,那么因为不同系统的API结构不同,绘图功能也需要不同的实现方式,那么该如何设计更合适呢?如下图:,增加了纯虚构类AbstractShape,不论是哪个系统都可以通过AbstractShape类来绘制图形,我们即没有降低原来的内聚性,也没有增加过多的耦合,,Indirection(间接)“间接”顾名思义,就是这个事不能直接来办,需要绕个弯才行。绕个弯的好处就是,本来直接
8、会连接在一起的对象彼此隔离开了,一个的变动不会影响另一个。例如“两个不同模块的内部类之间不能直接连接”,但是可以通过中间类来间接连接两个不同的模块,这样对于这两个模块来说,它们之间仍然是没有耦合/依赖关系的。,Protected Variations(受保护变化)预先找出不稳定的变化点,使用统一的接口封装起来,如果未来发生变化的时候,可以通过接口扩展新的功能,而不需要去修改原来旧的实现。,二、可复用面向对象设计的基本原则,2.1、开闭原则OCP(Open-Closed Principle):-Software entities(classes,modules,functions,etc)sho
9、uld be open for extension,but closed for modification-软件实体(类,模块,函数等)应当对扩展开放,对修改关闭;,理解:撰写软件模块时,应该让它可以扩展,同时无须修改。可以改变模块的行为,而不改模块的源代码。OCP原则的基础是抽象,只有抽象才可以抓住事物的本质和共性,保证相对的稳定,实现以不变应万变的功能。支持OCP的技术是抽象、继承、多态、接口。符合该法则便意味着最高等级的复用性(reusability)和可维护性(maintainability)。,符合OCP的模块标准:可扩展,即“对扩展是开放的”(Open For Extension)
10、模块的行为可以被扩展,以需要满足新的需求。不可更改,即“对更改是封闭的”(Closed for Modification)模块的源代码是不允许进行改动的。,优越性:通过扩展已有的软件系统,提供新的行为,以满足软件的新需求,使得变化中的软件系统有较好的适应性和灵活性;已有的软件模块,特别是抽象层模块不被修改,这就使得变化中的软件就有一定的稳定性和灵活性。,说明OCP的理想是在不改变源代码的情况下改变模块的功能,这不易实现。如果部分的OCP实现,也可以戏剧性地改善应用程序的结构。如果能控制变动不再传播到现有已经可以运行的程序代码当中,就很理想了。OCP在模式设计中得到广泛的应用。,2.2、如何实现
11、开闭原则,2.2.1、针对接口编程,而不是针对(接口的)实现编程Program To An Interface,Not An Implementation,接口的定义对象声明的每一个方法所指定的方法名、参数和返回值构成了对象的方法签名(signature)。对象方法所定义的所有方法签名的集合被称为该对象的接口(interface),它描述了该对象所能接受的全部请求的集合。在面向对象系统中,对象只通过接口与外部交流。对象接口与其功能实现是分离的,两个有相同接口的对象可以有完全不同的实现。对应程序设计语言中interface/abstract class。,从接口导出的子类有如下特点:子类仅仅添加
12、或重定义操作,而没有隐藏父类的操作。所有的子类都能响应接口中的请求,子类的类型都是接口的子类型。,实施原则不将变量声明为某个特定的具体类的实例对象,而声明为抽象类所定义的接口。当不得不在系统的某个地方实例化具体的类时,可应用创建型模式(Abstract Factory,Builder,Factory Method,Prototype和Singleton)。创建型模式确保系统是采用针对接口的方式书写的,而不是针对实现而书写的。,好处:1)客户无须知道所使用对象的特定类型,只须对象有客户所期望的接口;2)客户无须知道所使用的对象是用什么类来实现的,只须知道定义接口的抽象类。3)降低程序各部分之间的
13、耦合性,使程序模块互换成为可能。,例子,Public interface IManeuverablePublic void left();public void right();Public void forward();public void reverse();public void setSpeed(double speed);Public float getSpeed();,Public class Car implements IManeuverable/Public class Boat implements IManeuverable/IManeuverable Iman=new
14、 Car();Iman.setspeed();,2.2.2、优先使用对象组合,而不是类继承,英文原意:Favor object composition over class inheritance.什么是组合(composition)是一种通过创建一个组合了其它对象的对象,从而获得新功能的复用方法。包括聚合(aggregation)和包容(containment)两种特殊形式。聚合标识拥有关系(has a),如运动员与运动队。包容是强烈的拥有关系,拥有者负责被拥有者的生命周期,如汽车与轮胎关系。,组合与继承的比较联系组合以及继承的目的都是为了复用。区别继承是一种通过扩展一个已有对象的实现,从而
15、获得新功能的复用方法;组合使得原有对象成为新对象的一部分,因此新的对象可以调用已有对象的功能。,组合的优点:因为对象只能通过接口访问,所以组合并不破坏封装性;因为对象的实现是基于接口写的只要类型一致,运行时刻可以用一个对象来替代另一个对象,所以实现上存在较少的依赖关系。优先使用对象组合有助于保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。基于对象组合的设计将使系统的行为依赖于对象间的关系而不是被定义在某个类中。,组合的缺点:会有较多的对象需要管理。为了能将多个不同的对象作为组合块来使用,必须仔细地对接口进行定义。,继承的优点:因为
16、大部分功能可以通过继承关系自动进入子类,所以新的实现较为容易。继承使修改或者扩展继承来的实现较为容易。,继承的缺点:因为继承在编译时刻就定义了,所以无法在运行时刻改变从父类继承的实现。父类通常至少定义了部分子类的具体表示,由于子类能揭示其父类的实现细节,所以继承常被认为“破坏了封装性”。子类中的实现与它的父类有紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化。复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性。一个可用的解决方法只继承抽象类,因为抽象类通常提供较少的实现。,如何应用这条原则理想情况下
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计 模式 02 面向 对象 原则
链接地址:https://www.31ppt.com/p-6607372.html