java 組合 繼承 代理

最近在看java編程思想,分享一下

之前只知道繼承,原來繼承不怎麼可靠啊

1.組合

public class Bath {
    private String s1 = "Happy",s2 = "Happy",s3, s4;
    private Soap castille;
    private int i;
    private float toy;

    public Bath() {
        System.out.println("Bath");
        s3 = "joy";
        toy = 3.14f;
        castille = new Soap();
    }
    { i = 47;}

    @Override
    public String toString() {
        if (s4 == null) {
            s4 = "Joy";
        }
        return "Bath{" +
                "s1='" + s1 + '\'' +
                ", s2='" + s2 + '\'' +
                ", s3='" + s3 + '\'' +
                ", s4='" + s4 + '\'' +
                ", castille=" + castille +
                ", i=" + i +
                ", toy=" + toy +
                '}';
    }
}
 class Soap{
        private String s;
        Soap(){
            System.out.println("Soap");
            s="Constructed";
        }
        public String toString(){
            return s;
        }
    } 
public static void Main(String[] args){
        Bath bath = new Bath();
        System.out.println(bath);
    }

2.繼承

在這裏插入圖片描述
這裏的代碼並非原書中的這部分代碼,爲代理部分的代碼

 public class SpaceShipControls {
    void up(int velocity){}
    void down(int velocity){}
    void left(int velocity){}
    void right(int velocity){}
    void forward(int velocity){}
    void back(int velocity){}
    void turbBoost(){}
    /***
     * 繼承
     */
 class SpaceShip extends SpaceShipControls{
        private String name;
        public SpaceShip(String name){
            this.name = name;
        }
        public String toString(){
            return name;
        }
    }
public static void Main(String[] args){
        //繼承之後 SpaceShipControls的所有方法在SpaceShip對象中都暴露了
        SpaceShip spaceShip = new SpaceShip("NSEA Protector");
        spaceShip.forward(100);
    }
}

3.代理

在這裏插入圖片描述

public class SpaceShipControls {
    void up(int velocity){}
    void down(int velocity){}
    void left(int velocity){}
    void right(int velocity){}
    void forward(int velocity){}
    void back(int velocity){}
    void turbBoost(){}
    /***
     * 代理
     */
    class SpaceShipDelegation{
        private String name;
        private SpaceShipControls controls = new SpaceShipControls();
        public SpaceShipDelegation(String name){
            this.name = name;
        }
        public void back(int velocity){
            controls.back(velocity);
        }
        public void right(int velocity){
            controls.back(velocity);
        }
        public void left(int velocity){
            controls.back(velocity);
        }
        public void down(int velocity){
            controls.back(velocity);
        }
        public void up(int velocity){
            controls.back(velocity);
        }
        public void forward(int velocity){
            controls.forward(velocity);
        }
        public void turbBoost(){
            controls.turbBoost();
        }
    }
    public static void Main(String[] args){
        //使用代理,我們擁有更多的控制力
        SpaceShipDelegation spaceShipDelegation = new SpaceShipDelegation("NSEA Protector");
        spaceShipDelegation.back(100);
    }
}

在這裏插入圖片描述
組合:你要用可以,沒問題,拿去,別人要用你得告訴我一聲,你得負責管制着
繼承:人皆可夫,給了你 就相當於給了世界
組合:當前A類含有另一個B類對象
使用A類是也只是能使用該類的屬性和方法,要想用B裏面的東西就在A類中去寫一下,控制權在自己手裏
繼承:獲取父類的所有屬性和方法
使用該類可以調用父類的屬性和方法,繼承之後所有的東西都暴露了,破壞了封裝

4.組合和繼承混合使用

public class PlaceSetting {
    static class Plate{
        Plate(int i){
            System.out.println("Plate constructor");
        }
    }
    static class DinnerPlate extends  Plate{
        DinnerPlate(int i) {
            super(i);
            System.out.println("DinnerPlate constructor");
        }
    }
    static class Utensil{
        Utensil(int i){
            System.out.println("Utensil constructor");
        }
    }
    static class Spoon extends Utensil{
        Spoon(int i) {
            super(i);
            System.out.println("Spoon constructor");
        }
    }
    static class Fork extends  Utensil{
        Fork(int i) {
            super(i);
            System.out.println("Fork constructor");
        }
    }
    static class Knife extends Utensil{
        Knife(int i) {
            super(i);
            System.out.println("Knife constructor");
        }
    }
    static class Custom{
        Custom(int i){
            System.out.println("Custom constructor");
        }
    }
    static class PlaceSettings extends Custom{
        private Spoon sp;
        private Fork frk;
        private Knife kn;
        private DinnerPlate pl;
        public PlaceSettings(int i) {
            super(i+1);
            sp = new Spoon(i+2);
            frk = new Fork(i+3);
            kn = new Knife(i+4);
            pl = new DinnerPlate(i+5);
            System.out.println("PlaceSettings constructor");
        }
    }
   public static void Main(String[] args){
        PlaceSettings placeSettings = new PlaceSettings(9);
    }
}

– 代碼與圖片均來自《java編程思想》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章