`
chunming525
  • 浏览: 54344 次
  • 性别: Icon_minigender_1
  • 来自: 衡阳
社区版块
存档分类
最新评论

一直让我迷惑的问题-UML的类图关系(c#实例)

阅读更多

    UML的类图关系分为: 关联、聚合/组合、依赖、泛化(继承)。

     /// <summary>
    /// UML类图关系:关联
    /// </summary>

    #region 双向关联:双方都拥有对方的一个指针,当然也可以是引用或者是值。C1-C2

   

    class C1
    {
        public C2 theC2 = new C2();
    };

    class C2
    {
        public C1 theC1 = new C1();
    };
    #endregion

    #region 单向关联:C3有C4的指针,而C4对C3一无所知。C3->C4

   

    class C3
    {
        public C4 theC4 = new C4();

    };

    class C4
    {

    };
    #endregion

    #region 自身关联(反身关联):自己引用自己,带着一个自己的引用。

   

    class C14
    {
        public C14 theC14 = new C14();

    };

    #endregion

    /// <summary>
    /// UML类图关系:聚合/组合
    /// 当类之间有整体-部分关系的时候,我们就可以使用组合或者聚合。
    /// </summary>


    //聚合:表示C9聚合C10,但是C10可以离开C9而独立存在
    //(独立存在的意思是在某个应用的问题域中这个类的存在有意义)。

   

    class C9
    {
        public C10 theC10 = new C10();
    };

    class C10
    {

    };

    //组合(也有人称为包容):一般是实心菱形加实线箭头表示,
    //表示的是C8被C7包容,而且C8不能离开C7而独立存在。
    //但这是视问题域而定的,例如在关心汽车的领域里,
    //轮胎是一定要组合在汽车类中的,因为它离开了汽车就没有意义了。
    //但是在卖轮胎的店铺业务里,就算轮胎离开了汽车,它也是有意义的,这就可以用聚合了。

   

    class C7
    {
        public C8 theC8 = new C8();
    };

    class C8
    {

    };

    //可以看到,代码和聚合是一样的。具体如何区别,可能就只能用语义来区分了。

    /// <summary>
    /// UML类图关系:依赖
    /// </summary>

    //指C5可能要用到C6的一些方法,也可以这样说,
    //要完成C5里的所有功能,一定要有C6的方法协助才行。
    //在形式上一般是C5中的某个方法把C6的对象作为参数使用(假设C5依赖于C6)。
    //注意,要避免双向依赖。一般来说,不应该存在双向依赖。

   

     using namespaceOfC6

    class C5
    {
        void Func(C6 c6)
        { }
    };

    /// <summary>
    /// UML类图关系:泛化(继承)
    /// </summary>

    
   

    class C11
    {
    }

    class C12 : C11
    {
    }


     重复度

这里再说一下重复度,其实看完了上面的描述之后,我们应该清楚了各个关系间的关系以及具体对应到代码是怎么样的,所谓的重复度,也只不过是上面的扩展,例如A和B有着“1对多”的重复度,那在A中就有一个列表,保存着B对象的N个引用,就是这样而已。

    依赖和聚合\组合、关联等有什么不同呢?

    关联是类之间的一种关系,例如老师教学生,老公和老婆,水壶装水等就是一种关系。这种关系是非常明显的,在问题领域中通过分析直接就能得出。

    依赖是一种弱关联,只要一个类用到另一个类,但是和另一个类的关系不是太明显的时候(可以说是“uses”了那个类),就可以把这种关系看成是依赖,依赖也可说是一种偶然的关系,而不是必然的关系,就是“我在某个方法中偶然用到了它,但在现实中我和它并没多大关系”。例如我和锤子,我和锤子本来是没关系的,但在有一次要钉钉子的时候,我用到了它,这就是一种依赖,依赖锤子完成钉钉子这件事情。

    组合是一种整体-部分的关系,在问题域中这种关系很明显,直接分析就可以得出的。例如轮胎是车的一部分,树叶是树的一部分,手脚是身体的一部分这种的关系,非常明显的整体-部分关系。

    上述的几种关系(关联、聚合/组合、依赖)在代码中可能以指针、引用、值等的方式在另一个类中出现,不拘于形式,但在逻辑上他们就有以上的区别。

     这里还要说明一下,所谓的这些关系只是在某个问题域才有效,离开了这个问题域,可能这些关系就不成立了,例如可能在某个问题域中,我是一个木匠,需要拿着锤子去干活,可能整个问题的描述就是我拿着锤子怎么钉桌子,钉椅子,钉柜子;既然整个问题就是描述这个,我和锤子就不仅是偶然的依赖关系了,我和锤子的关系变得非常的紧密,可能就上升为组合关系(让我突然想起武侠小说的剑不离身,剑亡人亡...)。这个例子可能有点荒谬,但也是为了说明一个道理,就是关系和类一样,它们都是在一个问题领域中才成立的,离开了这个问题域,他们可能就不复存在了。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics