让我们在编程时多知道点设计模式用来装B神马的

序言  

     记得有一段时间总有人在我耳边说起设计模式,那时候我还年轻,对此很不屑,我总是认为设计模式是形而上学的东西,我相信编程是自由意识与灵感的产物,好比作家在创作,而不应该去拿个模子生搬硬套。但是有一天我终于抛弃傲慢与偏见,发现自己对设计模式只是一知半解, 并不了解其中的精髓和深层次作用。随着工作经验日益增加,与越来越多的杰出的工程师们共事过之后,我的想法发生了改变。有一次我在阅读过其中一位高手的代码后突然觉得真的是自惭形秽,哪一位高手的代码简洁高效,注释清晰,单个文件里的方法结构一目了然,类与类之间的结构清晰自然,扩展方便,可维护性很好,请教高手后得知,其人在设计模式上颇有造诣,并推荐我去自学。于是我认识到,必须充充电,需要认真的搞清楚什么是设计模式。


      我们全部的知识基础都是来自我们的经验,而科学的建立,也就是在经验上的一种归纳主义。所以编程是一门技术,编程技术的好坏大多取决于我们的经验,那么设计模式就是我们在经验上的一种归纳主义,是无数先贤总结的编程规律,把编程认识到设计模式这个阶段,便是从科学的角度认识编程。好吧,我不是故意抬高程序员的地位,你不承认程序员与科学家有什么联系也没关系,你承认计算机是一门科学就好。那么既然都到科学这个级别了,那程序员还有更高的层次么?为了给我们程序员阶层在社会上争取点地位,不要老被人叫做“屌丝程序猿”,我们继续探讨更高级的程序员应当是什么样子的。当我们写的程序像诗歌一样优美,将软件产品塑造出艺术品级别的性能和交互,那么我们不就是艺术家么。以后再有人鄙视我们程序员屌丝没品位什么的,大可不必在意,在心里鄙视回去,老子是科学家的身份,还有艺术家范儿呢。

    下面是专业技术文章,看段子的同学可以略过。

1,第一章

  在学习面向对象之前,我们来一起温习一下面向对象的基础知识吧:在面向对象设计模式中,类与类之间主要有5种关系,他们分别是:依赖、关联、聚合、组合、继承。他们的耦合度依次增强。

1.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  

1.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

1.3 聚合(Aggregation)

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

代码实例:

#import "People.h"

@implementation People

@synthesize car;
-(void)setCar:(Car *)inputCar
{
    self.car = inputCar;
}

-(void)drivingCar
{
    NSLog(@"车的型号是%@",car.type);
}

@end

1.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);
}

1.5 继承(Generalization)

继承表示类与类之间的父子关系。在IOS中,用“:”表示继承关系(@interface People :NSObject)。UML图例中,继承关系用实线+空心箭头表示,箭头指向父类。

继承代码比较简单,这里就不附加代码了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值