桥接模式(BridgePattern)
场景
存在两个兵工厂,用来生产M4A1和AK47

将两个兵工厂与具体的步枪分开,通过聚合来实现相关联。


实现
兵工厂相关类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| public abstract class AbstractArsenal { private AbstractRifle abstractRifle;
public AbstractArsenal(AbstractRifle abstractRifle) { this.abstractRifle = abstractRifle; }
public void operationRifle() { this.abstractRifle.reloading(); this.abstractRifle.fire(); } }
public class RussiaArsenal extends AbstractArsenal {
public RussiaArsenal(AbstractRifle abstractRifle) { super(abstractRifle); }
@Override public void operationRifle() { System.out.println("RussiaArsenal!!!"); super.operationRifle(); } }
public class USAArsenal extends AbstractArsenal { public USAArsenal(AbstractRifle abstractRifle) { super(abstractRifle); }
@Override public void operationRifle() { System.out.println("USAArsenal!!!"); super.operationRifle(); } }
|
具体步枪类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| public abstract class AbstractRifle {
protected abstract void fire();
protected abstract void reloading(); }
public class M4A1 extends AbstractRifle { @Override protected void fire() { System.out.println("M4A1射击,哒哒哒哒"); }
@Override protected void reloading() { System.out.println("M4A1装弹中......"); } }
public class Ak47 extends AbstractRifle { @Override protected void fire() { System.out.println("Ak47射击,乌拉乌拉"); }
@Override protected void reloading() { System.out.println("AK47装弹中......"); } }
|
测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public class Test { public static void main(String[] args) { RussiaArsenal russiaArsenal1 = new RussiaArsenal(new Ak47()); russiaArsenal1.operationRifle(); RussiaArsenal russiaArsenal2 = new RussiaArsenal(new M4A1()); russiaArsenal2.operationRifle(); USAArsenal usaArsenal1 = new USAArsenal(new Ak47()); usaArsenal1.operationRifle(); USAArsenal usaArsenal2 = new USAArsenal(new M4A1()); usaArsenal2.operationRifle(); } }
|
RussiaArsenal!!!
AK47装弹中……
Ak47射击,乌拉乌拉
RussiaArsenal!!!
M4A1装弹中……
M4A1射击,哒哒哒哒
USAArsenal!!!
AK47装弹中……
Ak47射击,乌拉乌拉
USAArsenal!!!
M4A1装弹中……
M4A1射击,哒哒哒哒
个人理解
桥接这个模式就是将抽象与实现解耦,使这两者可以独立的变化,就像上面的例子中,增加一个M16步枪类,扩展非常简单,或者增加一个中国兵工厂,并不影响具体的步枪类。这个模式也从一方面解决了用继承的话会产生类爆炸的问题,俄罗斯M4A1、俄罗斯AK47、美国M4A1、美国AK47等等,这样的话类就特别多,每次扩展也非常不方便。
突然感觉这个和抽象工厂解决工厂方法类爆炸问题好像(#>д<)ノ!