设计模式学习笔记1——类与类之间的关系

设计模式学习笔记1——类与类之间的关系,第1张

本文约束条件
本文以单继承的角度进行分析,多继承要转化为单继承(多继承中定一个为基类,其他类为接口类等)。


1.继承关系
概念
继承又分为2种方式,一种实现继承一种接口继承。


参见笔记——2种继承方式学习笔记
OOPL(面向对象语言)中有继承的各规范语法(由编译器/解释器负责管理),比如python用括号表示继承,“子类(父类):”。


再比如c++用冒号表示继承,“子类:父类{}”。



在OOPC(c语言面向对象)中怎么判定呢?如果调用其基类时会调用该类的同名函数,那么基类和该类是继承关系(通俗点就是说,子类里的基类方法会调用子类里的方法)。



关键词:is a
画图符号:实线+空心三角形(空心三角形指向父类)

2.接口关系
概念
接口关系只是继承接口,增加新能力。


比如超人会飞——超人继承人类,外加继承一个飞的接口类。


再比如唐老鸭会说话,唐老鸭继承鸭类,外加继承一个说话的接口类。



OOPL(面向对象语言)中有接口的各规范语法(由编译器/解释器负责管理),比如c++里有virtual关键字,java里有interface关键字等。



在OOPC(c语言面向对象)中怎么判定呢?只包含函数指针的类是接口类。



关键词:interface
画图符号:虚线+空心三角形(空心三角形指向接口类)——与继承的差异是一个实线一个虚线,因为一个是真继承,一个是假继承——主要是继承方法而已。


3.组合关系
概念
组合关系用来表示类与类之间是整体与部分的关系,是一个强的has a的关系。


比如人有一双眼睛、一只鼻子、两只耳朵、一个嘴巴,那么人与眼睛、鼻子、耳朵、嘴巴就是组合关系,一体的,一损俱损,一荣俱荣,就是生命周期一样,那些眼睛、鼻子、耳朵、嘴巴是人类构造函数负责创建的。



OOPL(面向对象语言)中没有语法约定,实现形式是:构造函数中,其他类创建的对象作为该类的属性等形式。



在OOPC(c语言面向对象)中怎么判定呢?类的属性是其他类创建的对象,且初始化时负责创建该类对象作为自己的属性。



关键词:强的has a
画图符号:实心菱角形+实线+大于号>剪头(实心表示强烈的“has”(拥有)的关系,剪头指向被has的类)

4.聚合关系
概念
聚合关系相对组合关系来说的,是一个弱的has关系,用来表示类与类之间是合作、聚集的关系。


比如是人群是由一个个人类的集合,雁群是一个个大雁的集合。



OOPL(面向对象语言)中没有语法约定,实现形式是:构造函数中,某类的属性是另外一类的数组。



在OOPC(c语言面向对象)中怎么判定呢?类的属性是其他类定义成的数组。



关键词:弱的has a
画图符号:空心菱角形+实线+大于号>剪头(空心表示很弱的“has”(拥有)的关系,剪头指向被has的类)

5.依赖关系
概念
依赖关系用来表示一个类依赖另一个类的关系。


比如动物依赖阳光、空气、水、食物等。



OOPL(面向对象语言)中没有语法约定,实现形式是一类对象作为另一类的形参,那么形参的类是为被依赖的类。



在OOPC(c语言面向对象)中怎么判定呢?也好定义呀,就是该类方法的形参传入的是其他类的对象,其他类就是该类依赖的类,它们是依赖关系。



关键词:依赖关系
画图符号:虚线+大于号>剪头(虚线表示依赖的关系,剪头指向所依赖的类)

6.关联关系
概念
关联关系用来表示一个类会关联到另一个类。


比如人类与地球,人类与气候,企鹅与温度。



OOPL(面向对象语言)中没有语法约定,实现形式是一类的属性引用到另一类,且有关联则是关联关系。



在OOPC(c语言面向对象)中怎么判定呢?属性是某类的对象,且关系是关联型的。



关键词:关联关系
画图符号:实线+大于号>剪头(实线表示关联关系,剪头指向所关联的类)

总结
组合关系、依赖关系和关联关系因为OOPL和OOPC没有对应语法约束,这些关系从实现形式上很难认出来,都可以是类的属性——那只能靠人自己去区分了。


你看类、继承、接口在OOPC中都有语法约束,比如class关键字、继承形式(括号或者冒号)、virtual关键字和interface关键字,编译器/解释器会从语言层面解决——是不是关键字由编译器/解释器来决定和维护的(开发编译器/解释器的人才是这个语言的上帝)。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/562287.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-01
下一篇 2022-04-01

发表评论

登录后才能评论

评论列表(0条)

保存