Design Pattern Java Tutorial

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