设计模式的六种关系与代码之间的对应

强弱关系:依赖<关联<聚合<组合<实现<继承

一、依赖VS关联

依赖

依赖关系的定义为:对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。定义比较晦涩难懂,但在java中的表现还是比较直观的:类A当中使用了类B,其中类B是作为类A的方法参数、方法中的局部变量、或者静态方法调用。

说明:

虚线+箭头

可描述为:Uses a

依赖是类的六种关系中耦合最小的一种关系。

因为在生成代码的时候,这两个关系类都不会增加属性

image.png


//一、动物依赖水,水类本身是全局的,动物类可以调用它 
Public class Animal(){
      Public Animal(){}
 }
       
Public class Water(){
      public Water(){}
} 
 
//二、水是动物类中某个类的方法,动物类可以调用它
Public class Animal {
      Public void Grownup() {
               Water water =null;
      }
}
 
//三、水类作为动物类中某个方法的参数或返回值
Public Animal {
   Public Water Grownup(Water water) {
              return null;
      }
}

总结:Water类被Animal类的一个方法持有。生命期随着方法的执行结束而结束 

 

关联

对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间为关联关系。关联关系分为单向关联和双向关联。在java中,单向关联表现为:类A当中使用了类B,其中类B是作为类A的成员变量。双向关联表现为:类A当中使用了类B作为成员变量;同时类B中也使用了类A作为成员变量。

 

说明:

实线+箭头

可描述为:Has a

关联关系用实线,表示类之间的耦合度比依赖强

在生成代码的时候,关联关系的类会增加属性。

(一)单向关联

image.png

//单向关联
Public class Water {
     public Climate m_Climate;
     public Water(){}
}
Public class Climate {
     public Climate() {}
} 

(二)双向关联

image.png

//双向关联
Public class Water {
    public Climate m_Climate;
    public Water(){}
}
Public class Climate {
    public Water m_Water;
    public Climate() {}
}

总结:依赖和关联之间的关系是什么?

1、从类的属性是否增加的角度看

  (1)发生依赖关系的两个类都不会增加属性。其中的一个类作为另一个类的方法的参数或者返回值,或者是某个方法的变量而已。

  (2)发生关联关系的两个类,其中的一个类成为另一个类的属性,而属性是一种更为紧密的耦合,更为长久的持有关系。

2、从关系的生命期角度看:

  (1)依赖关系是仅当类的方法被调用时而产生,伴随着方法的结束而结束了。

  (2)关联关系是当类实例化的时候即产生,当类销毁的时候,关系结束。相比依赖讲,关联关系的生存期更长。

 

二、聚合VS组合

聚合

聚合关系是关联关系的一种,耦合度强于关联,他们的代码表现是相同的,仅仅是在语义上有所区别:关联关系的对象间是相互独立的,而聚合关系的对象之间存在着包容关系,他们之间是“整体-个体”的相互关系。

说明

空心菱形+箭头

类之间的耦合关系比组合弱

image.png

Public class GooseGroup 
{
    private Goose goose;
    Public GooseGroup(Goose goose) 
    {
        this.goose = goose;
    }
}

组合

组合关系的类表示“整体-部分”的关联关系,“整体”负责“部分”的生命周期,他们之间是共生共死的;并且“部分”单独存在时没有任何意义

说明

实心菱形+箭头

类之间的耦合关系比聚合强

image.png

Public class Goose 
{
   private Wings wings;
   public Goose() 
   {
       wings = new Wings();
   }
}

总结:

1、构造函数不同

     聚合类的构造函数中包含了另一个类作为参数。 雁群类(GooseGroup)的构 造函数中要用到大雁(Goose)作为参数传递进来。大雁类(Goose)可以脱离雁群类而独立存在。

     组合类的构造函数中包含了另一个类的实例化。 表明大雁类在实例化之前,一定要先实例化翅膀类(Wings),这两个类紧密的耦合在一起,同生共灭。翅膀类(Wings)是不可以脱离大雁类(Goose)而独立存在。

2、信息的封装性不同。

         在聚合关系中,客户端可以同时了解雁群类和大雁类,因为他们都是独立的。

         在组合关系中,客户端只认识大雁类,根本就不知道翅膀类的存在,因为翅膀类被严密的封装在大雁类中。

 

三、继承VS实现

继承

继承表示类与类(或者接口与接口)之间的父子关系。在java中,用关键字extends表示继承关系。UML图例中,继承关系用实线+空心箭头表示,箭头指向父类

说明:

实线+箭头

可描述为:Is a

泛化也称继承,子类将继承父类的所有属性和方法,并且可以根据需要对父类进行拓展。

image.png

Class  Bird : Animal{
}

实现

表示一个类实现一个或多个接口的方法。接口定义好操作的集合,由实现类去完成接口的具体操作。在java中使用implements表示。UML图例中,实现关系用虚线+空心箭头表示,箭头指向接口。

说明:

虚线+箭头

image.png

Class WideGoose:Ifly{ 
}

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值