Bridge パターン

Bridge パターン

Step 1

MyMain

public class MyMain {
    public static void main(String args[]) {
        // AとBの組み合わせが 2X2で 4種類のクラスを作成
        MyClass myClass = new MyClassA1B1();
        System.out.println(myClass.getName());
        System.out.println(myClass.getAge());
        System.out.println(myClass.getAddress());
        System.out.println(myClass.getFloor());
        System.out.println();

        myClass = new MyClassA1B2();
        System.out.println(myClass.getName());
        System.out.println(myClass.getAge());
        System.out.println(myClass.getAddress());
        System.out.println(myClass.getFloor());
        System.out.println();

        myClass = new MyClassA2B1();
        System.out.println(myClass.getName());
        System.out.println(myClass.getAge());
        System.out.println(myClass.getAddress());
        System.out.println(myClass.getFloor());
        System.out.println();

        myClass = new MyClassA2B2();
        System.out.println(myClass.getName());
        System.out.println(myClass.getAge());
        System.out.println(myClass.getAddress());
        System.out.println(myClass.getFloor());
        System.out.println();

        // 組み合わせが増えると クラスの種類が 爆発的に増えてしまう...
    }
}

MyClass

public abstract class MyClass {
    public abstract String getName();
    public abstract int    getAge();
    public abstract String getAddress();
    public abstract int    getFloor();
}

MyClassA1B1

public class MyClassA1B1 extends MyClass {
    // MyClassA1xx と 共通
    public String getName() {
        return "Suzuki";
    }
    public int getAge() {
        return 20;
    }
    // MyClassxxB1 と 共通
    public String getAddress() {
        return "Tokyo";
    }
    public int getFloor() {
        return 2;
    }
}

MyClassA1B2

public class MyClassA1B2 extends MyClass {
    // MyClassA1xx と 共通
    public String getName() {
        return "Suzuki";
    }
    public int getAge() {
        return 20;
    }
    // MyClassxxB2 と 共通
    public String getAddress() {
        return "Yokohama";
    }
    public int getFloor() {
        return 3;
    }
}

MyClassA2B1

public class MyClassA2B1 extends MyClass {
    // MyClassA2xx と 共通
    public String getName() {
        return "Tanaka";
    }
    public int getAge() {
        return 30;
    }
    // MyClassxxB1 と 共通
    public String getAddress() {
        return "Tokyo";
    }
    public int getFloor() {
        return 2;
    }
}

MyClassA2B2

public class MyClassA2B2 extends MyClass {
    // MyClassA2xx と 共通
    public String getName() {
        return "Tanaka";
    }
    public int getAge() {
        return 30;
    }
    // MyClassxxB2 と 共通
    public String getAddress() {
        return "Yokohama";
    }
    public int getFloor() {
        return 3;
    }
}

実行結果

L:\>java MyMain
Suzuki
20
Tokyo
2

Suzuki
20
Yokohama
3

Tanaka
30
Tokyo
2

Tanaka
30
Yokohama
3
Step 2 「Bridge パターン」

MyMain

public class MyMain {
    public static void main(String args[]) {
        MyClassA classA = new MyClassA1();
        classA.setClassB(new MyClassB1());
        System.out.println(classA.getName());
        System.out.println(classA.getAge());
        System.out.println(classA.getAddress());
        System.out.println(classA.getFloor());
        System.out.println();

        classA.setClassB(new MyClassB2());
        System.out.println(classA.getName());
        System.out.println(classA.getAge());
        System.out.println(classA.getAddress());
        System.out.println(classA.getFloor());
        System.out.println();

        classA = new MyClassA2();
        classA.setClassB(new MyClassB1());
        System.out.println(classA.getName());
        System.out.println(classA.getAge());
        System.out.println(classA.getAddress());
        System.out.println(classA.getFloor());
        System.out.println();

        classA.setClassB(new MyClassB2());
        System.out.println(classA.getName());
        System.out.println(classA.getAge());
        System.out.println(classA.getAddress());
        System.out.println(classA.getFloor());
        System.out.println();
    }
}

MyClassA

// MyClass を 2つのクラスに 分割
public abstract class MyClassA {
    public abstract String   getName();
    public abstract int      getAge();

    // MyClassB の インスタンスを 保持
    private MyClassB classB;
    public void setClassB(MyClassB instance) {
        classB = instance;
    }
    public String getAddress() {
        return classB.getAddress();
    }
    public int getFloor() {
        return classB.getFloor();
    }
}

MyClassB

// MyClass を 2つのクラスに 分割
public abstract class MyClassB {
    public abstract String getAddress();
    public abstract int getFloor();
}

MyClassA1

public class MyClassA1 extends MyClassA {
    public String getName() {
        return "Suzuki";
    }
    public int getAge() {
        return 20;
    }
}

MyClassA2

public class MyClassA2 extends MyClassA {
    public String getName() {
        return "Tanaka";
    }
    public int getAge() {
        return 30;
    }
}

MyClassB1

public class MyClassB1 extends MyClassB {
    public String getAddress() {
        return "Tokyo";
    }
    public int getFloor() {
        return 2;
    }
}

MyClassB2

public class MyClassB2 extends MyClassB {
    public String getAddress() {
        return "Yokohama";
    }
    public int getFloor() {
        return 3;
    }
}

実行結果

L:\>java MyMain
Suzuki
20
Tokyo
2

Suzuki
20
Yokohama
3

Tanaka
30
Tokyo
2

Tanaka
30
Yokohama
3