@startuml
package com.iluwatar.bridge {
  class App {
    + App()
    + main(args : String[]) {static}
  }
  class BlindingMagicWeapon {
    + BlindingMagicWeapon(imp : BlindingMagicWeaponImpl)
    + blind()
    + getImp() : BlindingMagicWeaponImpl
    + swing()
    + unwield()
    + wield()
  }
  abstract class BlindingMagicWeaponImpl {
    + BlindingMagicWeaponImpl()
    + blindImp() {abstract}
  }
  class Excalibur {
    - LOGGER : Logger {static}
    + Excalibur()
    + blindImp()
    + swingImp()
    + unwieldImp()
    + wieldImp()
  }
  class FlyingMagicWeapon {
    + FlyingMagicWeapon(imp : FlyingMagicWeaponImpl)
    + fly()
    + getImp() : FlyingMagicWeaponImpl
    + swing()
    + unwield()
    + wield()
  }
  abstract class FlyingMagicWeaponImpl {
    + FlyingMagicWeaponImpl()
    + flyImp() {abstract}
  }
  abstract class MagicWeapon {
    # imp : MagicWeaponImpl
    + MagicWeapon(imp : MagicWeaponImpl)
    + getImp() : MagicWeaponImpl
    + swing() {abstract}
    + unwield() {abstract}
    + wield() {abstract}
  }
  abstract class MagicWeaponImpl {
    + MagicWeaponImpl()
    + swingImp() {abstract}
    + unwieldImp() {abstract}
    + wieldImp() {abstract}
  }
  class Mjollnir {
    - LOGGER : Logger {static}
    + Mjollnir()
    + flyImp()
    + swingImp()
    + unwieldImp()
    + wieldImp()
  }
  class SoulEatingMagicWeapon {
    + SoulEatingMagicWeapon(imp : SoulEatingMagicWeaponImpl)
    + eatSoul()
    + getImp() : SoulEatingMagicWeaponImpl
    + swing()
    + unwield()
    + wield()
  }
  abstract class SoulEatingMagicWeaponImpl {
    + SoulEatingMagicWeaponImpl()
    + eatSoulImp() {abstract}
  }
  class Stormbringer {
    - LOGGER : Logger {static}
    + Stormbringer()
    + eatSoulImp()
    + swingImp()
    + unwieldImp()
    + wieldImp()
  }
}
MagicWeapon -->  "-imp" MagicWeaponImpl
BlindingMagicWeapon --|> MagicWeapon 
BlindingMagicWeaponImpl --|> MagicWeaponImpl 
Excalibur --|> BlindingMagicWeaponImpl 
FlyingMagicWeapon --|> MagicWeapon 
FlyingMagicWeaponImpl --|> MagicWeaponImpl 
Mjollnir --|> FlyingMagicWeaponImpl 
SoulEatingMagicWeapon --|> MagicWeapon 
SoulEatingMagicWeaponImpl --|> MagicWeaponImpl 
Stormbringer --|> SoulEatingMagicWeaponImpl 
@enduml