1 前言
最近新工作太忙了,好久没有写博客了,经过一段时间的编码,发现自己写的代码真的是太差劲了,难维护,扩展性低,重复代码过多。自己分析分析总结一下,发现是自己缺少了一项优秀程序员的技能--设计模式,所以最近打算充充电,和大家一起学习一下设计模式,有问题之处请大家指点一二。
转载请注明出处:http://blog.csdn.net/developer_zhang
2 详述
在学习面向对象之前,我们来一起温习一下面向对象的基础知识吧:
在面向对象设计模式中,类与类之间主要有5种关系,他们分别是:依赖、关联、聚合、组合、继承。他们的耦合度依次增强。
2.1 依赖(Dependence)
依赖关系的定义为:对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。定义比较晦涩难懂,但在面向对象中的表现还是比较直观的:类A当中使用了类B,其中类B是作为类A的方法参数、方法中的局部变量、或者静态方法调用。类上面的图例中:People类依赖于Book类和Food类,Book类和Food类是作为类中方法的参数形式出现在People类中的。
代码实例:
- #import "People.h"
- @implementation People
- //Book作为read方法的形参
- -(void)read:(Book*) book{
- NSLog(@"读的书是:%@",book.name);
- }
- @end
2.2关联(Association)、、
单向关联:
双向关联:
对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间为关联关系。关联关系分为单向关联和双向关联。在java中,单向关联表现为:类A当中使用了类B,其中类B是作为类A的成员变量。双向关联表现为:类A当中使用了类B作为成员变量;同时类B中也使用了类A作为成员变量。
代码实例:
- #import "Father.h"
- @implementation Father
- @synthesize name;
- @synthesize son;
- -(Father*)init
- {
- self=[super init]; //先使用父类方法进行初始化
- if (self!=nil) {
- son = [[Son alloc] init];
- }
- return self;
- }
- @end
- #import "Son.h"
- #import "Father.h"
- @implementation Son
- @synthesize name;
- @synthesize father;
- -(Son*)init
- {
- self=[super init]; //先使用父类方法进行初始化
- if (self!=nil) {
- // father = [[Father alloc] init];
- }
- return self;
- }
- @end
2.3 聚合(Aggregation)
聚合关系是关联关系的一种,耦合度强于关联,他们的代码表现是相同的,仅仅是在语义上有所区别:关联关系的对象间是相互独立的,而聚合关系的对象之间存在着包容关系,他们之间是“整体-个体”的相互关系。
代码实例:
- #import "People.h"
- @implementation People
- @synthesize car;
- -(void)setCar:(Car *)inputCar
- {
- self.car = inputCar;
- }
- -(void)drivingCar
- {
- NSLog(@"车的型号是%@",car.type);
- }
- @end
2.4 组合(Composition)
相比于聚合,组合是一种耦合度更强的关联关系。存在组合关系的类表示“整体-部分”的关联关系,“整体”负责“部分”的生命周期,他们之间是共生共死的;并且“部分”单独存在时没有任何意义。在下图的例子中,People与Soul、Body之间是组合关系,当人的生命周期开始时,必须同时有灵魂和肉体;当人的生命周期结束时,灵魂肉体随之消亡;无论是灵魂还是肉体,都不能单独存在,他们必须作为人的组成部分存在。
代码实例:
- //组合
- @synthesize body;
- -(People*)init
- {
- self = [super init];
- if (self!=nil) {
- body = [[Body alloc] init];
- }
- return self;
- }
- -(void)eat
- {
- NSLog(@"吃饭用身体:%@",body.name);
- }
2.5 继承(Generalization)
继承表示类与类之间的父子关系。在IOS中,用“:”表示继承关系(@interface People :NSObject)。UML图例中,继承关系用实线+空心箭头表示,箭头指向父类。
继承代码比较简单,这里就不附加代码了。
代码下载地址:http://download.csdn.net/detail/u010013695/6942183
3 结语
以上就是设计模式基础知识的所有内容,欢迎大家共同切磋交流,一起进步,十分感谢!