1. 程式人生 > >設計模式必須要弄明白的組合和繼承

設計模式必須要弄明白的組合和繼承

前言

​ 哇,最近再看Java程式設計思想,看到了第七章複用類中7.5在組合和繼承之間選擇。讓我對組合和繼承有了新的認知,前一段時間把設計模式看完了,雖然說看了幾遍,但是思想永遠的記不住,理解不了。但是今天,結合著組合和繼承讓我有了新的認知,故想給學設計模式的同學一個我的理解思路。

組合和繼承

理解組合和繼承,實現,然後再組合和繼承中做出選擇

以下出自 Java程式設計思想

括號內是我自己的理解

組合和繼承都允許在新的類中放置子物件,組合是顯式的這樣做,繼承(,實現)是隱式的做。

組合技術通常用於想在新類中使用現在類的功能而並非他的介面這種情形,即,在新類中嵌入某個物件,讓其實現所需的功能,但新類的使用者看到的只是為新類定義的介面,而非所嵌入物件的介面

。為取得此效果,需要在新類中嵌入一個現有類的private物件。

組合是一種has-a(有一個)的關係來表達。繼承,實現是is-a(是一個)的關係來表達

我現在舉一個設計模式的例子把,就簡單的結構型模式,代理模式。

描述一下業務場景,你需要用google搜尋,那麼這時你就需要代理,才能FQ,進行goole搜素。

程式碼實現

抽象的使用者類:

/**
 * @InterfaceName Person
 * @Description 抽象使用者介面
 * @Author ouyangkang
 * @Date 2018-11-14 09:37
 **/
public interface Person {

    void login(ConcretePerson concreteperson);

    void search();
}

具體的使用者類:


/**
 * @ClassName ConcretePerson
 * @Description 具體使用者 (抽象介面使用者的具體實現) 解釋:具體使用者是一個使用者
 * @Author ouyangkang
 * @Date 2018-11-14 09:37
 **/
public class ConcretePerson implements Person {


    private String userName;

    private String userPC;

    @Override
    public void login(ConcretePerson concretePerson) {
        System.out.printf("使用者登陸資訊 user=%s \n",concretePerson.toString());
    }

    @Override
    public void search() {
        System.out.println("開始搜素!!");
    }


    @Override
    public String toString() {
        return "ConcretePerson{" +
                "userName='" + userName + '\'' +
                ", userPC='" + userPC + '\'' +
                '}';
    }



    public void setUserName(String userName) {
        this.userName = userName;
    }
    public void setUserPC(String userPC) {
        this.userPC = userPC;
    }
}

代理類:


/**
 * @ClassName Proxy
 * @Description 代理物件  代理物件是一個使用者,並且它還有一個使用者 。這樣是不是好理解多了
 * @Author ouyangkang
 * @Date 2018-11-14 09:39
 **/
public class Proxy implements Person {

    private Person person;

    public Proxy(Person person) {
        this.person = person;
    }


  //代理的介面
    @Override
    public void login(ConcretePerson concreteperson) {
        System.out.println("加速服務");
        this.person.login(concreteperson);
    }

  //代理的介面
    @Override
    public void search() {
        System.out.println("開啟代理。。 ");
        this.person.search();
        System.out.println("google 搜素結果如下。。。");
    }
}

演示類:

/**
 * @ClassName main
 * @Description 演示
 * @Author ouyangkang
 * @Date 2018-11-14 09:45
 **/
public class main {

    public static void main(String[] args) {
        ConcretePerson person = new ConcretePerson();


        person.setUserName("ouyang");
        person.setUserPC("oy-pc");
        Person proxy = new Proxy(person);


        proxy.login(person);
        proxy.search();


    }
}

結果如下:

加速服務
使用者登陸資訊 user=ConcretePerson{userName='ouyang', userPC='oy-pc'} 
開啟代理。。 
開始搜素!!
google 搜素結果如下。。。