设计模式已经学了很长时间了,最近又看了一遍,感觉很不一样。当初很难理解或不理解的,现在一看,恍然大悟:哦!原来是这么回事啊~~~
先说一下对几种关系的理解,包括:依赖、关联、聚合、组合、继承、实现,耦合依次增高。
1.依赖
用虚箭头表示,对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。在java中,类A使用了类B,其中类B是作为类A的方法参数、方法中的局部变量、或者静态方法调用,这几种情况是依赖。下图中People类依赖于Food类,Food类是作为类中方法的参数形式出现在People类中的。
publicclass People{ //Food作为eat方法的形参 public void eat(Food mantou){ System.out.println(“人们要吃”+mantou.getName()); } }
2.关联
有单向关联和双向关联,对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间为关联关系。单向关联表现为:类A使用了类B,其中类B是作为类A的成员变量。双向关联表现为:类A当中使用了类B作为成员变量;同时类B中也使用了类A作为成员变量。
局部变量和成员变量主要是他们作用域的区别:
1.成员变量个是类内部;局部变量是定义其的方法体内部(或者方法体内部的某一程序块内——大括号,主要看定义的位置)。
2.成员变量可以不显式初始化,它们可以由系统设定默认值;局部变量没有默认值,所以必须设定初始赋值。
3.在内存中的位置也不一样。成员变量在所在类被实例化后,存在堆内存中;局部变量在所在方法调用时,存在栈内存空间中。
双向关联:
单向关联:
代码:
public class Student{ //关联关系中作为成员变量的类一般会在类中赋值 Teacher teacher = new Teacher(); public void DoHomework(){ System.out.println(“从”+teacher.getName()+”获得作业”); } } public class Teacher{ Student student = new Student(); public void giveHomework(){ System.out.println(“给”+student.getName()+“留作业”); } }
上面的代码是一个双向关联。
3.聚合
聚合关系属于关联关系,耦合度强于关联,代码表现是相同的,在语义上的表现有所区别:关联关系的对象间是相互独立的,聚合关系的对象之间存在着包容关系,是“整体-个体”的相互关系。
Public class Yanqun{ Dayan dayan; //聚合关系中作为成员变量的类一般使用set方法赋值 public void setDayan(Dayan dayan){ This.dayan = dayan; } public void fly(){ System.out.println(“大雁飞:”+dayan.fly()); } }
4.组合
相比于聚合,组合是一种耦合度更强的关联关系。存在组合关系的类表示“整体-部分”的关联关系,“整体”负责“部分”的生命周期,共生共死;“部分”不能单独存活。大雁和翅膀之间是组合关系,当大雁的生命周期开始时,必须有翅膀;当大雁的生命周期结束时,翅膀也会跟着死掉;翅膀是不能单独存在,必须作为大雁的组成部分存在。
代码:
Public class Dayan{ Chibangchibang; //组合关系中的成员变量一般会在构造方法中赋值 Public Dayan(Chibangchibang){ This.chibang = chibang; } Public void fly(){ System.out.println(“飞行要用”+chibang.getName()); } }
通过代码也可以看出聚合和组合明显的区别,组合关系时,是在构造函数时使用的,即,当大雁存在了,翅膀也跟着生成了。
5.继承
继承表示类与类(或者接口与接口)之间的父子关系。在java中,用关键字extends表示继承关系。在UML中,继承关系用实线+空心箭头表示,箭头指向父类。
Public classDayanextends
Niao{
}
6.实现
表示一个类实现一个或多个接口的方法。接口定义好操作的集合,由实现类去完成接口的具体操作。在java中使用implements表示。在UML图中,实现关系用虚线+空心箭头表示,箭头指向接口。
代码:
Public classDayanImplements
Niaoleixingwei{
}
总结:
其实,聚合、组合是特殊的关联关系,继承和实现本质也是相同的;依赖是最弱的耦合关系,依赖和关联关系本质也是类似的,都是在一个类中使用另一个类。所以,这些联系也没什么难懂的,so
easy~~~