设计模式
个人感觉设计模式是程序员的核心技能= =,然后看了一些设计模式的书,都是讲设计模式的一些理论,放在实现上都有点模糊,后来图书馆看到一本《设计模式的艺术》,感觉很不错,有一些比较具体且容易理解的实现方式,做个记录和分享。
类的关系实现
关联(Association)关系
这个就是比较常见的一种了,就是类和类之间的关系,互相存在关联,比如汽车和轮胎,班级和学生,不同的关联关系具体要求不一样,比如双向关联要求两个类都有相互之间的引用,而单向只能存在一方对另一方的引用,下面具体展开。
关联关系一共有六种如下:
- 双向关联
- 单向关联
- 自关联
- 多重性关联
- 聚合关系
- 组合关系
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(){
...
}
}
面向对象设计的原则
一共有七个,这个比较常见,然后书中有关于使用频率的介绍,这个我觉得也很实用。
单一指责
开闭原则
里氏代换原则
依赖倒转原则
接口隔离
合成复用
迪米特法则
有空补充