設計模式
個人感覺設計模式是程序員的核心技能= =,然后看了一些設計模式的書,都是講設計模式的一些理論,放在實現上都有點模糊,后來圖書館看到一本《設計模式的藝術》,感覺很不錯,有一些比較具體且容易理解的實現方式,做個記錄和分享。
類的關系實現
關聯(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(){...}
}
面向對象設計的原則
一共有七個,這個比較常見,然后書中有關于使用頻率的介紹,這個我覺得也很實用。
單一指責
開閉原則
里氏代換原則
依賴倒轉原則
接口隔離
合成復用
迪米特法則
有空補充