home > デザインパターン >

ForNext

Only Do What Only You Can Do

Bridge

VBScript

JScript

Perl

PHP

Python

Ruby

PowerShell

Scala

F#

C

C++

C++Builder

VC++

C#

Java

更新日 : 2010.11.25

■ Step 1 パターン適用前

■ 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;
    }
}
■ 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();

        // 組み合わせが増えると クラスの種類が 爆発的に増えてしまう...
    }
}
L:\>java MyMain
Suzuki
20
Tokyo
2

Suzuki
20
Yokohama
3

Tanaka
30
Tokyo
2

Tanaka
30
Yokohama
3

■ Step 2 Bridge

■ 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 (追加)
// MyClassA1B1 を 2つのクラスに 分割
public class MyClassA1 extends MyClassA {
    public String getName() {
        return "Suzuki";
    }
    public int getAge() {
        return 20;
    }
}
■ MyClassA2 (追加)
// MyClassA2B1 を 2つのクラスに 分割
public class MyClassA2 extends MyClassA {
    public String getName() {
        return "Tanaka";
    }
    public int getAge() {
        return 30;
    }
}
■ MyClassB1 (追加)
// MyClassA1B1 を 2つのクラスに 分割
public class MyClassB1 extends MyClassB {
    public String getAddress() {
        return "Tokyo";
    }
    public int getFloor() {
        return 2;
    }
}
■ MyClassB2 (追加)
// MyClassA1B2 を 2つのクラスに 分割
public class MyClassB2 extends MyClassB {
    public String getAddress() {
        return "Yokohama";
    }
    public int getFloor() {
        return 3;
    }
}
■ 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();
    }
}
L:\>java MyMain
Suzuki
20
Tokyo
2

Suzuki
20
Yokohama
3

Tanaka
30
Tokyo
2

Tanaka
30
Yokohama
3

Objective-C

D

VB

VB.NET

Delphi

Ada

PL/SQL

T-SQL

関数型

inserted by FC2 system