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