class Abstraction {
private Task task;
public Abstraction(Task imp) {
task = imp;
}
public void service1() {
task.task1();
task.task2();
}
public void service2() {
task.task2();
task.task3();
}
public void service3() {
task.task1();
task.task2();
task.task4();
}
protected Task getImplementation() {
return task;
}
}
class ClientService1 extends Abstraction {
public ClientService1(Task imp) {
super(imp);
}
public void serviceA() {
service1();
service2();
}
public void serviceB() {
service3();
}
}
class ClientService2 extends Abstraction {
public ClientService2(Task imp) {
super(imp);
}
public void serviceC() {
service2();
service3();
}
public void serviceD() {
service1();
service3();
}
public void serviceE() {
getImplementation().task3();
}
}
interface Task {
void task1();
void task2();
void task3();
void task4();
}
class Integration1 {
public void method1() {
System.out.println("Integration1.method1()");
}
public void method2() {
System.out.println("Integration1.method2()");
}
}
class Integration {
public void operation1() {
System.out.println("Integration.operation1()");
}
public void operation2() {
System.out.println("Integration.operation2()");
}
public void operation3() {
System.out.println("Integration.operation3()");
}
}
class Implementation1 implements Task {
private Integration1 delegate = new Integration1();
public void task1() {
System.out.println("Implementation1.facility1");
delegate.method1();
}
public void task2() {
System.out.println("Implementation1.facility2");
delegate.method2();
}
public void task3() {
System.out.println("Implementation1.facility3");
delegate.method2();
delegate.method1();
}
public void task4() {
System.out.println("Implementation1.facility4");
delegate.method1();
}
}
class Implementation2 implements Task {
private Integration delegate = new Integration();
public void task1() {
System.out.println("Implementation2.facility1");
delegate.operation1();
}
public void task2() {
System.out.println("Implementation2.facility2");
delegate.operation2();
}
public void task3() {
System.out.println("Implementation2.facility3");
delegate.operation3();
}
public void task4() {
System.out.println("Implementation2.facility4");
delegate.operation1();
}
}
public class BridgeStructure {
public static void main(String[] args) {
ClientService1 cs1 = new ClientService1(new Implementation1());
cs1.serviceA();
cs1.serviceB();
cs1 = new ClientService1(new Implementation2());
cs1.serviceA();
cs1.serviceB();
ClientService2 cs2 = new ClientService2(new Implementation1());
cs2.serviceC();
cs2.serviceD();
cs2.serviceE();
cs2 = new ClientService2(new Implementation2());
cs2.serviceC();
cs2.serviceD();
cs2.serviceE();
}
}