系统对象和类分析

来源:互联网 发布:淘宝买的基金看不到了 编辑:程序博客网 时间:2024/04/29 20:44

静态分析阶段(定义类的关系以及对象的关系)

关联和链接
   1) 关联——针对类而言,表示类之间的使用关系。
      . 类的相互的使用关系称为双向关联。
      . 指类图中用直线表示的关系;
      . 线可以是水平也可以是垂直的;
      . 可以在关系线上给一个逻辑名称描述这个关系;
   2) 链接——针对对象而言
      . 指对象图中二个对象间的关系;

类的关联
   1)一个类中的属性是另一个类的对象,另一个类中也有这个类的对象作为其属性。(双向关联)"has a"(一对一关联)
   2)一个类中包含另一个类的多个对象(集合)作属性,另一个类中也有这个类的一个对象作为其属性。(一对多关联)
   3)一个类中包含有另一类的多个对象(集合)作属性,另一个类中同样也有这个类的多个对象作属性。(多对多关联),
以上所介绍的关联关系都是双向关联。

多对多关联是复杂的关联关系,要是用关联类来把多对多转变成两个一对多关系,也可以通过在多对多关联中的类中加上一个唯一标识对象的键值,

关联和多样性
   1) 多样性显示了一个类中对象和另一个类中对象联系的可能性;
   2) 在类图中,每个类只有一个矩形,因此联接会确定一个类有多少个对象链接于另一个类的对象;
   3) 联接线的末端有标记;

多样性的值
   1) 2: 刚好二个;(确定值)
   2) *: 0至多个; (不确定值)
   3) 5..15: 5到15个; (范围值)
   4) 2,4,6: 2、4、6个; (可选值)
   5) 10..*: 最少10个;
   6) 0..10: 最多10个;

复杂性的联接
   1) 多样性标记“*”出现在联接的两端;
   2) 你命名了类图中所有联接并分配了多样性后,是时候重新审视他们并尝试解决复杂联接。可使用联接类或符合条件联接。

关联类(类似于数据库中索引表)
   1) 这意味着联接它本身必须编码为一个类,这个类带有解决冲突的属性;
   2) 这种技术用于分析阶段解决多对多关系;

符合条件的联接
   1) 通过使用属性值可解决多对多问题;
   2) 分配一个唯一的属性值;

依赖,一个类,通过类中的方法包含另一个类的对象,并通过此对象调用另一个类中的方法,方法参数就是一个类对另一个类发送的消息(也可能是对象)。

分析阶段的逻辑关系

   1) 在一个系统中必须存在一些关系以便进行适当地操作;
   2) 逻辑关系表达了一个类和另一个类如何关联、一个对象怎样得到或使用另一个对象;
   3) 问下列问题:
      . 一个类依赖于另一个类的某些功能吗?
      . 是否存在一种非常强的关系以致一个对象缺少了另一个便不能存在?
   4) 在这个模块讨论的逻辑关系如下:
      . 继承(Inheritance):
        a. 一般,(泛化)父类,子类的泛化,也就是抽取共性,抽象
        b. 特殊,(特化)子类,父类的特化,也就是在泛化抽象中加上了某种特性,特化
      . 多态(Polymorphism)
      . 关联(Association)
        a. 聚合(Aggregation)
        b. 组合(Composition)
    
继承(Inheritance)
   1) 继承的概念描述了你如何在一组类似或相同目的类间共享或得到属性以及功能;
   2) 单继承和多重继承;
   3) 使用继承,我们能够 :
      . 降低全部系统的尺寸;
      . 改善设计和维护的功能;
   4) Car、Bus、Train、Airplane、Ship, 他们都是交通工具。他们可以移动以及驾驶,它们可以将人从A地运往B地。
    
子类和父类
   1) 当一个类继承自其它类,它被称为“子类”;
   2) 当一个类被继承自其它类,它被称为“父类”;

注意:如果继承关系没有处理好,在使用多态上就会出现问题,所以要正确的处理继承关系。

继承分析
 
继承的二种类型:

   . 一般继承:

         

   . 特殊继承:

         

多态
   1) 是一个和继承关系密切的OO术语;
   2) 多态这个名字来源于希腊,意思是“多种形态”;
   3) 从分析透视图看来,多态意味着不同类型和多种属性可分配于类;
   4) Java和C++支持多态;
 
抽象类
   1) 是一些包含未实现功能的类,这些类不能实例化。一个类继承了一个抽象类继承了所有方法(包括抽象方法);
   2) 任何类继承了抽象类后除非实现了所有的抽象方法,否则也是抽象的;
 
UML中关于抽象类的符号
   1) 抽象类的类名为斜体;
   2) 抽象方法名也是斜体;

角色:表示一类数据结构的关系结构,角色可以是不同的类,可以通过角色来区别不同的对象的所能够使用的功能。

反身(反射)关联(加角色)

   1) 对象图中,相同类的二个实体间的联系;
   2) 但是在类图中只有一个类代表这些对象;
   3) 因此,这种关联回转到相同的类。这样的关联称为反身关联;
   4) 反身关联在关联线的末端必须存在角色名字。这明确地说明你是如何关联这个类的二个对象。

             wife
             |ˉˉˉˉˉ ˉˉˉˉˉ ˉˉˉˉˉ ˉ  |
        |ˉˉˉˉˉ ˉˉˉˉˉ ˉˉˉˉˉ|
        |  Person       |        |
        |__________|        |married
        |ˉˉˉˉˉ ˉˉ ˉˉ ˉˉ ˉˉ |      |
        |__________|        |
            ↑____________|
             husband

关联(Association)
   1) 关联用于描述类图中二个类间的关系;
   2) 包括一些更紧密关系诸如:聚合(Aggregation)和组合(Composition)
      . 联系:厨师使用刀;
      . 聚合:一辆车有一个车载电台;
      . 组合:一辆车一般只包括一个发动机;

        |ˉˉˉˉˉ ˉˉ ˉˉ ˉˉˉˉ |        用刀     |ˉˉˉˉˉˉˉ ˉˉ ˉˉ ˉˉ |
        |   Chef          | chops with  |   Knife         |
        |___厨师___ |------------>    |____刀____ |
        |ˉˉˉˉˉ ˉˉˉˉˉˉˉ ˉˉ  |                    | ˉˉˉˉˉ ˉˉ ˉˉ ˉˉˉˉ|
        |__________ |                    |__________|

聚合(Aggregation)
   1) 是关联中的一种;
   2) 更紧密的关联方式;
   3) 聚合是一种整体/部分关系,但“部分”可以被其它对象共享(“部分可以脱离整体存在”),因而有可能在“整体”外存活。
   4) 表现为“Has A”关系;

        |ˉˉˉˉˉ ˉˉ ˉˉ ˉˉ ˉˉ|                    |ˉˉˉˉˉˉˉ ˉˉ ˉˉ ˉˉˉ|
        |    Car          |     has a       | CarRadio   |
        |__________| ◇------------ |__________|
        |ˉˉˉ ˉˉˉˉˉˉ ˉˉ ˉˉ|                    |ˉˉˉˉ ˉ ˉ ˉ ˉˉ ˉ ˉ|
        |__________|                    |__________|

组合(Composition)
   1) 最紧密的关联方式;
   2) 表现为“always contains”关系,部分不能离开整体存在,整体也不能够缺少部分而使用 例如:车不能没有引擎
   3) 在UML图上表现为一黑色的菱形

        |ˉˉˉˉ ˉ ˉ ˉ ˉˉ ˉ ˉ |                    |ˉˉˉˉ ˉ ˉ ˉ ˉˉ ˉˉ|
        |   Car            |     driven by |  Enginee    |
        |__________ | ◆------------ |__________|
        |ˉˉˉˉˉ ˉˉˉˉ ˉˉ ˉˉ |                     |ˉˉˉˉˉ ˉˉ ˉˉ ˉ ˉ ˉ|
        |__________|                     |__________|

方法的扩散

方法的扩散,是建立在聚合和组合的关系之上,类和类之间的方法的调用,会造成方法的扩散,也就是类中的方法通过关联的属性来调用这个属性的类型中定义的方法,方法扩散,可以导致整体的多个部分中的方法被连锁调用。

方法的扩散:
    . 代理,整体和部分的类型是同一个类别(同一父类,或实现统一接口),他们之间的方法传递叫代理 ,可以使用多态特性。
    . 委托,整体和部分的类型是不同类别,他们的方法传递叫作委托。

动态模型分析

在分析阶段创建动态模型
   1) 一旦在分析阶段完成对象模型建模,你可以开始对系统和对象在整个时间段内运作方式进行建模,这称为动态建模。
   2) 动态建模发生二次:
      . 在逻辑分析阶段(确信每个操作都是可能的)
        a. 时序图(Sequence diagrams)/协作图(Collaboration diagram);
        b. 状态转换图(State transition diagram);
        c. 活动图(Activity diagram);
      . 在物理设计阶段(分配方法描述给对应的类)
责任
 
在OOA&D中,“责任”指:
   . 一个类知道什么(状态);
   . 一个类做什么(行为);
   . 一个类型知道什么(状态);
   . 一个类型做什么(行为);

分配责任
 
在分配责任时,很重要去确定以及实现以下内容:
   . 专家(指你所分配责任的类完全可实现其责任,这减小了额外对象的依赖以及支持低耦合);
   . 创建者(谁应该创建一个实例);
   . 高聚合(一个类的属性一起完成得很好);
   . 低耦合(减少对象间的依赖性);

改变的必要
   1) 一个系统中的对象存在是因为它们完成一些作务帮助系统完成它们的目标;
   2) 每个任务需要一定时间完成以及需要在对象间传递一些信息;
   3) 系统中的每个对象代表一组特定的活动;
   4) 你也应该考虑一个操作中所调用的对象以及它们是如何交互去完成这个操作的, 一个对象所完成的每个操作或子操作是如何改变对象的内在状态的;


时序图
   1) 模仿一定时间内一个系统的单个操作;
   2) 每个时序图:
      . 和一个用例或一个用例中的一个情景直接联系;
      . 确定每个过程中所调用的对象;
      . 确定在一个过程中发现的行业或事件;
      . 确定在每个过程中必须传输什么信息;
      . 确定每个行为后需要什么响应;
      . 对于每个用例至少产生一个时序图
   3) 在分析阶段,他们仅影响交互。在设计阶段,每个交互将会转为一个方法调用。
   4) 一个用例至少一个时序图, 时序图可以制作得很复杂以显示一个用例的多个情景,但最好还是每个情景对应一个时序图。

协作图
   1) 可以作为时序图的可选对象;
   2) 对象通过标有序号的箭头连接,这些箭头显示了信息的流程;
   3) 箭头从动作源指向目标对象;
   4) 箭头标有序号显示了在一个情景中它们使用的顺序;
   5) 协作图看上去像对象图的子集。操作中被调用的对象在图中表现为装有对象名称的盒子。


状态转换图
   1) 时序图和协作图显示了在一定时间段内系统中对象是如何传递信息的;
   2) 状态转换图显示了在一定时间段内一个对象是如何改变的,它的方法是如何被其它对象所调用;
   3) 组成:状态和事件;
   4) 箭头用于显示对象各种状态间的路径;
   5) 每个箭头显示了该对象是如何完成特定事件;
   乏值,也就是状态转换的临界值,状态转换的临界条件也就叫作乏值条件。
状态
   1) 所有对象均有状态,任何对象的当前状态由存储于其属性中的值指示;
   2) 设想一台打印机,它要么闲置、要么忙碌,打印机只有二种状态:闲置和忙碌;

事件
   1) 事件是一个对象从一种状态转换到另一种状态的促进因素;
   2) 事件表现为方法调用。方法是一个对象的某些或一系列改变状态的任务;
   3) 当一些对象调用打印机的print()方法,状态由闲置改变为忙碌,print()方法的调用就是导致状态改变的事件;
   4) 一个对象通常处于它状态中的一种,这意味着他们是稳定的。同时也意味着状态的改变应该越快越好。

             |ˉˉˉˉ ˉˉ ˉˉˉ ˉˉˉˉ |      print       |ˉˉˉˉˉ ˉˉˉ ˉˉˉ ˉˉˉ |
             |   idle           |--------------->|      busy       |
    ●---->|                    |                    |                    |
             |                    |<---------------|                    |
             |__________|      eof         |__________|
                  |
                  | delete
                  ↓
                  ◎

活动图
   1) 显示一个对象和工作流的关系以及描述了相应的处理方法;
   2) 每个用例只有一个活动图;
   3) 每个活动表现为一个圆,该圆上有连接线连到下一个活动。这个连接线被称为板机(trigger);
   4) 一个活动能产生多个板机,这依赖于活动的结果;

设计原则与模式

软件设计的核心问题,可维护性和可复用性。

设计原则

(OCP)开-闭原则,软件实体应对扩展开放,对修改关闭,也就是屏蔽了修改对使用者的影响(简单工厂模式不支持开闭原则),实现开闭原则要尽量使用抽象,实质就是要尽量降低耦合性,封装可变性。可变性间不能混合。(基本原则)

(LSP)里氏代换原则,任何使用父类的地方都可以把父类替换为子类而不影响正常运行。(多态的使用)


(DIP)依赖倒转原则,要把依赖关系建立到抽象(接口、父类)上,不要依赖于实现(子类,实现类)。(避免类关系复杂,提高可扩展性),针对接口编程,推迟实现。

(ISP)接口隔离原则,使用多个专用接口替代单一接口。

(CARR)组合/聚合复用原则,使用组合或聚合关系,替代继承。

(LoD)迪米特法则(最少支持原则),一个对象或模块应该和其他对象和模块尽量少通信(依赖)。

设计模式主要分三个类型:创建型、结构型和行为型

创建型:
    单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点
    抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类
    工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类
    建造者模式:将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示
    原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象
结构型:
    组合模式:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性
    外观模式:为子系统中的一组接口提供一致的界面,facade提供了一高层接口,这个接口使得子系统更容易使用
    代理模式:为其他对象提供一种代理以控制对这个对象的访问
    适配器模式:将一类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些类可以一起工作
    装饰模式:动态地给一个对象增加一些额外的职责,就增加的功能来说,Decorator模式相比生成子类更加灵活
    桥接模式:将抽象部分与它的实现部分相分离,使他们可以独立的变化
    享元模式:运用共享技术有效的支持大量细粒度的对象
行为型:
    迭代器模式:提供一个方法顺序访问一个聚合对象的各个元素,而又不需要暴露该对象的内部表示
    观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新
    模板方法:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,TemplateMethod使得子类可以不改变一个算法的结构即可以重定义该算法得某些特定步骤
    命令模式:将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队和记录请求日志,以及支持可撤销的操作
    状态模式:允许对象在其内部状态改变时改变他的行为。对象看起来似乎改变了他的类
    策略模式:定义一系列的算法,把他们一个个封装起来,并使他们可以互相替换,本模式使得算法可以独立于使用它们的客户
    职责链模式:使多个对象都有机会处理请求,从而避免请求的送发者和接收者之间的耦合关系
    中介者模式:用一个中介对象封装一些列的对象交互
    访问者模式:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这个元素的新操作
    解释器模式:给定一个语言,定义他的文法的一个表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子
    备忘录模式:在不破坏对象的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态


原创粉丝点击