电子商务网站界面设计,做美工要开通什么网站的会员呢,国内免费域名注册网站,温州网站维护工作UML类图中的五种关系的耦合强弱比较#xff1a;依赖关联聚合组合继承 一、依赖关系#xff1a; #xff08;一#xff09;说明 虚线箭头 可描述为#xff1a;Uses a 依赖是类的五种关系中耦合最小的一种关系。 因为在生成代码的时候#xff0c;这两个关系… UML类图中的五种关系的耦合强弱比较依赖关联聚合组合继承 一、依赖关系 一说明 虚线箭头 可描述为Uses a 依赖是类的五种关系中耦合最小的一种关系。 因为在生成代码的时候这两个关系类都不会增加属性。 二依赖关系图与代码的对应关系 PS依赖关系Animal依赖于Water动物依赖于水 [csharp] view plaincopyprint? Public class Animal() { Public Animal(){} } Public class Water() { public Water(){} } 可以看到生成的两个类的代码中什么都没有添加
。三思考 Animal类如何使用Water类呢或者说依赖关系到底是如何体现的呢 1、表现形式1 Water类是全局的则Animal类可以调用它 2、表现形式2 Water类是 Animal类的某个方法中的变量则Animal类可以调用它。 [csharp] view plaincopyprint? Public class Animal { Public void Grownup() { Water water null; } } 注意1 Water类的生命期它是当Animal类的GrounUp方法被调用的时候才被实例化。 注意2持有Water类的是Animal的一个方法而不是Animal类这点是最重要的 3、表现形式3 Water类是作为Animal类中某个方法的参数或者返回值 [csharp] view plaincopyprint? Public Animal { Public Water Grownup(Waterwater) { return null; } } 注意Water类被Animal类的一个方法持有。生命期随着方法的执行结束而结束
。二、关联关系 一说明 实线箭头 可描述为Has a 关联关系用实线表示类之间的耦合度比依赖强 在生成代码的时候关联关系的类会增加属性。 二关联关系与代码的对应关系 PS:Water类与Climate类关联水与气候关联。 [csharp] view plaincopyprint? Public classWater { public Climate m_Climate; public Water(){} } Public class Climate { public Climate() {} } 可见生成的代码中Water类的属性中增加了Climate类。三关联关系的种类 关联既有单向关联又有双向关联。 1、单向关联 Water类和Climate类单向关联如下图则Water类称为源类Climate类称为目标类。源类了解目标类的所有的属性和方法但目标类并不了解源类的信息。 2、双向关联源类和目标类相互了解彼此的信息。如将Water类和Climate类之间改为双向关联。 [csharp] view plaincopyprint? Public class Water { public Climate m_Climate; public Water(){} } Public class Climate { public Water m_Water; public Climate() {} } 可见生成的代码中两个类的属性都添加了四思考 依赖关系和关联关系的区别在哪里 1、从类的属性是否增加的角度看 1发生依赖关系的两个类都不会增加属性。其中的一个类作为另一个类的方法的参数或者返回值或者是某个方法的变量而已。 2发生关联关系的两个类其中的一个类成为另一个类的属性而属性是一种更为紧密的耦合更为长久的持有关系。 2、从关系的生命期角度看 1依赖关系是仅当类的方法被调用时而产生伴随着方法的结束而结束了。 2关联关系是当类实例化的时候即产生当类销毁的时候关系结束。相比依赖讲关联关系的生存期更长。 五关联关系的细化聚合、组合 1、说明 1聚合关系用空心菱形加箭头表示 2组合关系用实心菱形加箭头表示类之间的耦合关系比聚合强 2、聚合和组合都是关联关系的一种到底如何区分二者呢 1聚合和组合生成的代码 PS此图表明雁群类是由大雁类聚合而成 [csharp] view plaincopyprint? Public classGooseGroup { public Goose goose; Public GooseGroup(Goose goose) { this.goose goose; } } PS此图表明大雁类是由翅膀类组合而成 [csharp] view plaincopyprint? Public classGoose { public Wings wings; public Goose() { wings new Wings(); } } 2构造函数不同 聚合类的构造函数中包含了另一个类作为参数。 雁群类GooseGroup的构 造函数中要用到大雁Goose作为参数传递进来。大雁类Goose可以脱离雁群类而独立存在。 组合类的构造函数中包含了另一个类的实例化。 表明大雁类在实例化之前一定要先实例化翅膀类Wings这两个类紧密的耦合在一起同生共灭。翅膀类Wings是不可以脱离大雁类Goose而独立存在。 3信息的封装性不同。 在聚合关系中客户端可以同时了解雁群类和大雁类因为他们都是独立的。 在组合关系中客户端只认识大雁类根本就不知道翅膀类的存在因为翅膀类被严密的封装在大雁类中。 三、泛化 一说明 实线箭头 可描述为Is a 泛化也称继承子类将继承父类的所有属性和方法并且可以根据需要对父类进行拓展。 二泛化关系与代码的对应关系 PSBird类继承Animal类鸟是一种动物 [csharp] view plaincopyprint? Class Bird :Animal{ } 三思考 1、子类继承父类真的是继承了父类的所有属性和方法吗 子类确实是继承了父类的所有属性和方法只是对于父类的私有类型成员没有访问权限访问就会报错 2、泛化和继承是一回事儿吗 子类继承父类父类泛化子类。 这两个词是从不同的角度来说的 3、为什么要多用组合少用继承 继承和组合各 有优缺点。 类继承是在编译时刻静态定义的且可直接使用类继承可以较方便地改变父类的实现。但是类继承也有一些不足之处。首先因为继承在编译时刻就定义了所以无法在运行时刻改变从父类继承的实现。更糟的是父类通常至少定义了子类的部分行为父类的任何改变都可能影响子类的行为。如果继承下来的实现不适合解决新的问题则父类必须重写或被其他更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性。 对象组合是通过获得对其他对象的引用而在运行时刻动态定义的。由于组合要求对象具有良好定义的接口而且对象只能通过接口访问所以我们并不破坏封装性只要类型一致运行时刻还可以用一个对象来替代另一个对象更进一步因为对象的实现是基于接口写的所以实现上存在较少的依赖关系。 四、实现关系 虚线箭头 PSWideGoose类实现IFly接口。大雁实现飞翔的接口 [csharp] view plaincopyprint? Class WideGoose:Ifly{ } 实现关系重点理解接口的定义 接口interface接口是一种特殊的抽象类这种抽象类中只包含常量和方法的定义而没有变量和方法的实现。