设计模式中类之间的关系

设计模式

个人感觉设计模式是程序员的核心技能= =,然后看了一些设计模式的书,都是讲设计模式的一些理论,放在实现上都有点模糊,后来图书馆看到一本《设计模式的艺术》,感觉很不错,有一些比较具体且容易理解的实现方式,做个记录和分享。

类的关系实现

关联(Association)关系

这个就是比较常见的一种了,就是类和类之间的关系,互相存在关联,比如汽车和轮胎,班级和学生,不同的关联关系具体要求不一样,比如双向关联要求两个类都有相互之间的引用,而单向只能存在一方对另一方的引用,下面具体展开。
关联关系一共有六种如下:

  1. 双向关联
  2. 单向关联
  3. 自关联
  4. 多重性关联
  5. 聚合关系
  6. 组合关系

PS:碍于时间关系,下面的实例没有作关系图,有时间多的话补上。

双向关联

默认情况下,关联是双向的。
下面讲顾客购买商品和商品被卖给顾客之间的关系,顾客购买商品后拥有商品,商品被卖出后与某个顾客相关联,实际上存在双向的引用,代码如下:

public class Customer{private Product[] products;...
}
public class Product{private Customer customer;...
}

单向关联

每个顾客都有一个家庭地址,但是这个地址没办法包含顾客,所以这边是单向的关系,实现代码如下:

public class Customer{private Address[] address;...
}

自关联

引用指向自己的类型,这和递归不同,递归是调用本身方法,这是引用本身类型的对象。示例代码如下:

public class Node {private Node subNode;...
}

多重性(Multiplicity)关联

这个关联关系表示两个类型的对象在数量上之间的对应关系
换句话说就是另一个类的对象可以拥有几个该对象(从m到n的范围)

表示方式多重性说明
1..1表示另一个类的一个对象只与该类的一个对象有关系
0..*表示另一个类的一个对象与该类的零个或者多个对象有关系
1..*表示另一个类的一个对象与该类的一个或者多个对象有关系
0..1表示另一个类的一个对象没有或只与该类的一个对象有关系
m..n表示另一个类的一个对象与该类的零个或者多个对象有关系
 举例:public class Form{private Button[] buttons;  //定义为成员变量...}public class Button{...}

聚合(Aggregation)关系

聚合关系表示整体与部分的联系,值得注意的一点就是部分离开了整体也能存在,在实现的过程中通常是通过构造方法,Setter或业务方法等把成员对象注入到整体对象中。实现代码如下(汽车和发动机):

public class Car{private Engine engine;//构造注入public Car(Engine engine){this.engine = engine;}//设值注入public void setEngine(Engine engine){this.engine = engine;}...
}
public class engine{...
}

组合(Composition)关系

组合关系有一个很大的不同于之前的特点就是,组合一般会在对象初始化的时候创建成员对象(new),也就是在构造方法中直接实例化成员类。并且成员变量(对象)无法脱离整体对象,例如嘴巴不在脸上就没办法存在,实现代码如下:

public class Head{private Mouth mouth;public Head(){mouth = new mouth();}...
}
public class Mouth(){...
}

依赖(Deoendency)关系

依赖关系简单的理解就是特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系,多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。例如汽车的移动方式改变,会影响到驾驶员(开车)。(drive方法依赖move方法)实现代码如下:

public class Driver{public void drive(Car car){car.move;}
}
public class Car{public void move(){...}
}

泛化(Generalization)关系

这个比较容易理解,就是继承关系,用于描述父类和子类之间的关系。不做具体介绍,直接放代码:

//父类
public class Person{protected String name;protected int age;public void move(){}public void say(){}
}
//子类
public class Student extends Person{private String studentNo;public void tech(){...}
}
//子类
public class Teacher extends Person{private String teacherNo;public void teach(){}
}

接口与实现关系

面向对象的语言大多数都有接口概念,在接口中,通常没有属性,而且所有的操作都是抽象的,只有操作的声明,没有操作的实现,接口和接口与也可以依赖和继承,但是接口和类之间还存在一种实现的关系。

public interface Vehicle{public void move();
}
public class Ship implements Vehicle{public void move(){...}
}
public class Car implements Vehicle{public void move(){...}
}

面向对象设计的原则

一共有七个,这个比较常见,然后书中有关于使用频率的介绍,这个我觉得也很实用。

单一指责

开闭原则

里氏代换原则

依赖倒转原则

接口隔离

合成复用

迪米特法则

有空补充

转载于:https://www.cnblogs.com/didadida/p/10141714.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450326.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何查看jar包的版本号?

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 jar包根目录里的META-INF目录下的MANIFEST.MF文件里一般有会记录版本信息,可以到这个文件里查看 打开Java的JAR文件我们经…

JAVA中的toString()方法的用法

toString是Object类的方法,所有类都从Object类继承。如果你定义的类没有覆盖toString方法,则对象在调用toString方法时用的是Object类toString方法,返回的是“类名hashcode". System.out.println(obj)在参数是一个对象时,会首…

kotlin使用spring data jpa(一)

2019独角兽企业重金招聘Python工程师标准>>> 简单查询 spring data jpa是spring全家桶成员之一,用于操作各种数据库,下面写一个查询订单的简单示例 引入sqlserver驱动包及jpa所需包implementation(org.springframework.boot:spring-boot-star…

VC的函数修饰名

VC 中的修饰名(Decoration name) “C”或者“C”函数在内部(编译和链接)通过修饰名识别。修饰名是编译器在编译函数定义或者原型时生成的字 符串。有些情况下使用函数的修饰名是必要的,如在模块定义文件里头指定输出“C”重载函数、构造函数、…

You can‘t specify target table ‘XXX‘ for update in FROM clause

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 报错如题,意思大致是:在一条 sql 语句中不能先查出来部分内容,再同时又对当前表作修改。 解决方法&…

牛客网——最简真分数

题目描述 给出n个正整数&#xff0c;任取两个数分别作为分子和分母组成最简真分数&#xff0c;编程求共有几个这样的组合。输入描述: 每组包含n&#xff08;n<600&#xff09;和n个不同的整数&#xff0c;整数大于1且小于等于1000。 输出描述: 每行输出最简真分数组合的个数…

csvn(apache+svn)管理工具搭建

系统环境&#xff1a;centos7.4一、服务端下载这个文件并解压&#xff08;如果打不开&#xff0c;请下方留言&#xff09;https://pan.baidu.com/s/1miwdBc81、安装jdk,上传到服务器上&#xff0c;解压[rootslave2 opt]# tar -zxvf jdk-8u91-linux-x64.gz[rootslave2 opt]# vim…

java中程序执行顺序

①在java中执行顺序 一 静态初始化块 二 非静态初始化块 三 构造器 四 父类构造器 ② java中的赋值顺序 一 静态初始化块直接赋值 二 非静态初始化块直接赋值 三 父类继承的属性已赋值 四 静态变量声明时赋值 五 成员变量声明时赋值 六 构造器赋值 接下来我们用一个…

编程复杂性等级划分

摘要&#xff1a;相信开发人员一定对初级、中级、高级软件工程师这类词汇很熟悉吧&#xff01;你们是否对编程进行过等级划分&#xff1f;这个又是如何划分的呢&#xff1f;本文作者把编程复杂性从简到难化成27个等级&#xff0c;你同意这样的划分吗&#xff1f;通常来说&#…

对于抽象类的理解

这是我个人对抽象类的理解&#xff0c;为什么要有抽象类&#xff0c;因为我们在写某个类时&#xff0c;只能写出大概的一些属性和共性行为&#xff0c;并不能一下子写下所体现的具体细节&#xff0c;如我们学到的一个例子&#xff0c;我们人用打印机&#xff0c;可我们只知道打…

Spring中基于Java的配置@Configuration和@Bean用法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Spring中为了减少xml中配置&#xff0c;可以声明一个配置类&#xff08;例如SpringConfig&#xff09;来对bean进行配置。 一、首先&am…

【实数二分/前缀和维护】Best Cow Fences

Poj 2018 Best Cow Fences 实数二分前缀和维护 调了一晚上&#xff0c; 但发现没什么注意事项orz 无输出只因eps定义成了int型QAQ哭唧唧 #include<cstdio> #include<iostream> using namespace std; const int sz 100010; double eps 1e-5; int n, f; double a[s…

json回显

第一种&#xff1a;用json的oData塞值 案例显示&#xff1a; list页面url带值 //活动基本信息修改 function updateProject() {   var selectRow $$.getSingleSelectRow(listId, "请选择你要操作的项目进行修改&#xff01;");   if(selectRow.activity_status&…

NoSuchElementException

在之前下项目的时候遇到这个.NoSuchElementException异常,当时我写到一个大类的结尾。但是编译器。从未报错。然而在运行的时候出现了这样的异常&#xff0c;非常头疼 &#xff0c;一到运行时候就报异常&#xff0c;我就上网搜索了一下&#xff0c;才明白&#xff0c;这是我的刚…

东方程序员怎么看西方程序员

摘要&#xff1a;东方程序员与西方程序员&#xff0c;彼此心中是什么样子呢&#xff1f;本文收集了东西方程序员对彼此的看法与各种印象&#xff0c;对于西方/东方程序员&#xff0c;你留有什么印象呢&#xff1f; 本文是作者根据StackExchange上的一个讨论贴&#xff1a;东方程…

Android开发 - 掌握ConstraintLayout(一)传统布局的问题

在传统的Android开发中&#xff0c;页面布局占用了我们很多的开发时间&#xff0c;而且面对复杂页面的时候&#xff0c;传统的一些布局会显得非常复杂&#xff0c;每种布局都有特定的应用场景&#xff0c;我们通常需要各种布局结合起来使用来实现复杂的页面。随着ConstraintLay…

输入流与输出流的区别

stream结尾都是字节流&#xff0c;reader和writer结尾都是字符流两者的区别就是读写的时候一个是按字节读写&#xff0c;一个是按字符。实际使用通常差不多。在读写文件需要对内容按行处理&#xff0c;比如比较特定字符&#xff0c;处理某一行数据的时候一般会选择字符流。只是…

【Spring】Spring高级话题-@Enable***注解的工作原理

EnableAspectJAutoProxy 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 EnableAspectJAutoProxy注解 激活Aspect自动代理 <aop:aspectj-autoproxy/> 1 开启对AspectJ自动代理的支…

IDEA项目找不到浏览器报错的情况

调tomcat的时候&#xff0c;它会调用浏览器&#xff0c;浏览器关联如果有问题&#xff0c;肯定是会报错的 要是测试的时候&#xff0c;就是浏览器的问题&#xff0c;重新把浏览器装一遍让他自己重新关联一下应该就行了转载于:https://www.cnblogs.com/Koma-vv/p/10156478.html

c/c++经典面试试题及标准答案

下面的问题我想大部分c/c 程序员 都遇见过.如果没有看过&#xff0c;草根IT特别推荐一下。 一、请填写BOOL , float, 指针变量与“零值”比较的 if 语句。&#xff08;10分&#xff09;请写出 BOOL flag 与“零值”比较的 if 语句。&#xff08;3分&#xff09;标准答案&#x…