diff --git a/bridge/pom.xml b/bridge/pom.xml
new file mode 100644
index 000000000..382ef2aa2
--- /dev/null
+++ b/bridge/pom.xml
@@ -0,0 +1,23 @@
+
+
+ 4.0.0
+
+ com.iluwatar
+ java-design-patterns
+ 1.0-SNAPSHOT
+
+ com.iluwatar
+ bridge
+ 1.0-SNAPSHOT
+ bridge
+ http://maven.apache.org
+
+
+ junit
+ junit
+ 3.8.1
+ test
+
+
+
diff --git a/bridge/src/main/java/com/iluwatar/App.java b/bridge/src/main/java/com/iluwatar/App.java
new file mode 100644
index 000000000..695564087
--- /dev/null
+++ b/bridge/src/main/java/com/iluwatar/App.java
@@ -0,0 +1,26 @@
+package com.iluwatar;
+
+public class App
+{
+ public static void main( String[] args )
+ {
+ BlindingMagicWeapon blindingMagicWeapon = new BlindingMagicWeapon(new Excalibur());
+ blindingMagicWeapon.wield();
+ blindingMagicWeapon.blind();
+ blindingMagicWeapon.swing();
+ blindingMagicWeapon.unwield();
+
+ FlyingMagicWeapon flyingMagicWeapon = new FlyingMagicWeapon(new Mjollnir());
+ flyingMagicWeapon.wield();
+ flyingMagicWeapon.fly();
+ flyingMagicWeapon.swing();
+ flyingMagicWeapon.unwield();
+
+ SoulEatingMagicWeapon soulEatingMagicWeapon = new SoulEatingMagicWeapon(new Stormbringer());
+ soulEatingMagicWeapon.wield();
+ soulEatingMagicWeapon.swing();
+ soulEatingMagicWeapon.eatSoul();
+ soulEatingMagicWeapon.unwield();
+
+ }
+}
diff --git a/bridge/src/main/java/com/iluwatar/BlindingMagicWeapon.java b/bridge/src/main/java/com/iluwatar/BlindingMagicWeapon.java
new file mode 100644
index 000000000..9e61acfb2
--- /dev/null
+++ b/bridge/src/main/java/com/iluwatar/BlindingMagicWeapon.java
@@ -0,0 +1,33 @@
+package com.iluwatar;
+
+public class BlindingMagicWeapon extends MagicWeapon {
+
+ public BlindingMagicWeapon(BlindingMagicWeaponImp imp) {
+ super(imp);
+ }
+
+ @Override
+ public BlindingMagicWeaponImp getImp() {
+ return (BlindingMagicWeaponImp) imp;
+ }
+
+ @Override
+ public void wield() {
+ getImp().wieldImp();
+ }
+
+ @Override
+ public void swing() {
+ getImp().swingImp();
+ }
+
+ @Override
+ public void unwield() {
+ getImp().unwieldImp();
+ }
+
+ public void blind() {
+ getImp().blindImp();
+ }
+
+}
diff --git a/bridge/src/main/java/com/iluwatar/BlindingMagicWeaponImp.java b/bridge/src/main/java/com/iluwatar/BlindingMagicWeaponImp.java
new file mode 100644
index 000000000..5f8cc7bb7
--- /dev/null
+++ b/bridge/src/main/java/com/iluwatar/BlindingMagicWeaponImp.java
@@ -0,0 +1,7 @@
+package com.iluwatar;
+
+public abstract class BlindingMagicWeaponImp extends MagicWeaponImp {
+
+ public abstract void blindImp();
+
+}
diff --git a/bridge/src/main/java/com/iluwatar/Excalibur.java b/bridge/src/main/java/com/iluwatar/Excalibur.java
new file mode 100644
index 000000000..83f3e02ac
--- /dev/null
+++ b/bridge/src/main/java/com/iluwatar/Excalibur.java
@@ -0,0 +1,25 @@
+package com.iluwatar;
+
+public class Excalibur extends BlindingMagicWeaponImp {
+
+ @Override
+ public void wieldImp() {
+ System.out.println("wielding Excalibur");
+ }
+
+ @Override
+ public void swingImp() {
+ System.out.println("swinging Excalibur");
+ }
+
+ @Override
+ public void unwieldImp() {
+ System.out.println("unwielding Excalibur");
+ }
+
+ @Override
+ public void blindImp() {
+ System.out.println("bright light streams from Excalibur blinding the enemy");
+ }
+
+}
diff --git a/bridge/src/main/java/com/iluwatar/FlyingMagicWeapon.java b/bridge/src/main/java/com/iluwatar/FlyingMagicWeapon.java
new file mode 100644
index 000000000..2912cb7fc
--- /dev/null
+++ b/bridge/src/main/java/com/iluwatar/FlyingMagicWeapon.java
@@ -0,0 +1,32 @@
+package com.iluwatar;
+
+public class FlyingMagicWeapon extends MagicWeapon {
+
+ public FlyingMagicWeapon(FlyingMagicWeaponImp imp) {
+ super(imp);
+ }
+
+ public FlyingMagicWeaponImp getImp() {
+ return (FlyingMagicWeaponImp) imp;
+ }
+
+ @Override
+ public void wield() {
+ getImp().wieldImp();
+ }
+
+ @Override
+ public void swing() {
+ getImp().swingImp();
+ }
+
+ @Override
+ public void unwield() {
+ getImp().unwieldImp();
+ }
+
+ public void fly() {
+ getImp().flyImp();
+ }
+
+}
diff --git a/bridge/src/main/java/com/iluwatar/FlyingMagicWeaponImp.java b/bridge/src/main/java/com/iluwatar/FlyingMagicWeaponImp.java
new file mode 100644
index 000000000..5860f110d
--- /dev/null
+++ b/bridge/src/main/java/com/iluwatar/FlyingMagicWeaponImp.java
@@ -0,0 +1,7 @@
+package com.iluwatar;
+
+public abstract class FlyingMagicWeaponImp extends MagicWeaponImp {
+
+ public abstract void flyImp();
+
+}
diff --git a/bridge/src/main/java/com/iluwatar/MagicWeapon.java b/bridge/src/main/java/com/iluwatar/MagicWeapon.java
new file mode 100644
index 000000000..cddb00e9c
--- /dev/null
+++ b/bridge/src/main/java/com/iluwatar/MagicWeapon.java
@@ -0,0 +1,21 @@
+package com.iluwatar;
+
+public abstract class MagicWeapon {
+
+ protected MagicWeaponImp imp;
+
+ public MagicWeapon(MagicWeaponImp imp) {
+ this.imp = imp;
+ }
+
+ public abstract void wield();
+
+ public abstract void swing();
+
+ public abstract void unwield();
+
+ public MagicWeaponImp getImp() {
+ return imp;
+ }
+
+}
diff --git a/bridge/src/main/java/com/iluwatar/MagicWeaponImp.java b/bridge/src/main/java/com/iluwatar/MagicWeaponImp.java
new file mode 100644
index 000000000..99ec57b44
--- /dev/null
+++ b/bridge/src/main/java/com/iluwatar/MagicWeaponImp.java
@@ -0,0 +1,11 @@
+package com.iluwatar;
+
+public abstract class MagicWeaponImp {
+
+ public abstract void wieldImp();
+
+ public abstract void swingImp();
+
+ public abstract void unwieldImp();
+
+}
diff --git a/bridge/src/main/java/com/iluwatar/Mjollnir.java b/bridge/src/main/java/com/iluwatar/Mjollnir.java
new file mode 100644
index 000000000..4ba68ab6c
--- /dev/null
+++ b/bridge/src/main/java/com/iluwatar/Mjollnir.java
@@ -0,0 +1,25 @@
+package com.iluwatar;
+
+public class Mjollnir extends FlyingMagicWeaponImp {
+
+ @Override
+ public void wieldImp() {
+ System.out.println("wielding Mjollnir");
+ }
+
+ @Override
+ public void swingImp() {
+ System.out.println("swinging Mjollnir");
+ }
+
+ @Override
+ public void unwieldImp() {
+ System.out.println("unwielding Mjollnir");
+ }
+
+ @Override
+ public void flyImp() {
+ System.out.println("Mjollnir hits the enemy in the air and returns back to the owner's hand");
+ }
+
+}
diff --git a/bridge/src/main/java/com/iluwatar/SoulEatingMagicWeapon.java b/bridge/src/main/java/com/iluwatar/SoulEatingMagicWeapon.java
new file mode 100644
index 000000000..20e55294e
--- /dev/null
+++ b/bridge/src/main/java/com/iluwatar/SoulEatingMagicWeapon.java
@@ -0,0 +1,33 @@
+package com.iluwatar;
+
+public class SoulEatingMagicWeapon extends MagicWeapon {
+
+ public SoulEatingMagicWeapon(SoulEatingMagicWeaponImp imp) {
+ super(imp);
+ }
+
+ @Override
+ public SoulEatingMagicWeaponImp getImp() {
+ return (SoulEatingMagicWeaponImp) imp;
+ }
+
+ @Override
+ public void wield() {
+ getImp().wieldImp();
+ }
+
+ @Override
+ public void swing() {
+ getImp().swingImp();
+ }
+
+ @Override
+ public void unwield() {
+ getImp().unwieldImp();
+ }
+
+ public void eatSoul() {
+ getImp().eatSoulImp();
+ }
+
+}
diff --git a/bridge/src/main/java/com/iluwatar/SoulEatingMagicWeaponImp.java b/bridge/src/main/java/com/iluwatar/SoulEatingMagicWeaponImp.java
new file mode 100644
index 000000000..761a1a874
--- /dev/null
+++ b/bridge/src/main/java/com/iluwatar/SoulEatingMagicWeaponImp.java
@@ -0,0 +1,7 @@
+package com.iluwatar;
+
+public abstract class SoulEatingMagicWeaponImp extends MagicWeaponImp {
+
+ public abstract void eatSoulImp();
+
+}
diff --git a/bridge/src/main/java/com/iluwatar/Stormbringer.java b/bridge/src/main/java/com/iluwatar/Stormbringer.java
new file mode 100644
index 000000000..673ed99a7
--- /dev/null
+++ b/bridge/src/main/java/com/iluwatar/Stormbringer.java
@@ -0,0 +1,25 @@
+package com.iluwatar;
+
+public class Stormbringer extends SoulEatingMagicWeaponImp {
+
+ @Override
+ public void wieldImp() {
+ System.out.println("wielding Stormbringer");
+ }
+
+ @Override
+ public void swingImp() {
+ System.out.println("swinging Stormbringer");
+ }
+
+ @Override
+ public void unwieldImp() {
+ System.out.println("unwielding Stormbringer");
+ }
+
+ @Override
+ public void eatSoulImp() {
+ System.out.println("Stormbringer devours the enemy's soul");
+ }
+
+}
diff --git a/pom.xml b/pom.xml
index cf60e3c74..2deb6ce3a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -24,5 +24,6 @@
prototype
singleton
adapter
+ bridge
\ No newline at end of file