1. 程式人生 > >設計模式中類之間的關係

設計模式中類之間的關係

設計模式

個人感覺設計模式是程式設計師的核心技能= =,然後看了一些設計模式的書,都是講設計模式的一些理論,放在實現上都有點模糊,後來圖書館看到一本《設計模式的藝術》,感覺很不錯,有一些比較具體且容易理解的實現方式,做個記錄和分享。

類的關係實現

關聯(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(){
        ...
    }
}

面向物件設計的原則

一共有七個,這個比較常見,然後書中有關於使用頻率的介紹,這個我覺得也很實用。

單一指責

開閉原則

里氏代換原則

依賴倒轉原則

介面隔離

合成複用

迪米特法則

有空補充