设计模式之桥接模式
桥接模式--导读
我们应该都看过西游记吧,毕竟这是大家童年的经典。想必你一定见过这么一幕天蓬元帅犯了错误,而被罚投胎为猪身,此时,虽然天蓬元帅的灵魂没有变,但是身体却变成的猪身体。假如这个猪的身体是玉帝亲手造的,而且只能使用一次。但是这时玉帝又不想让天蓬元帅变成猪身,想让他变成马身,这时他又要造一个马身来惩罚,但是存在一个问题,天庭中不止有一个人犯错,而是有很多人犯错,玉帝要对他们进行相应的惩罚,变成不同的身体,这就需要玉帝不停的建造身体,然后将他们的灵魂放进去。所以玉帝就想出了一个办法,那就是建造一个投胎的地方,当玉帝想罚他们变成什么动物的时候就,仅仅需要将他们送到对应的地方投胎即可,当玉帝突发奇想,想新加一个新的惩罚方式时,仅需要新建一个投胎地点即可。而不需要频繁的建造身体。
这便是桥接模式:
桥接模式使得抽象部分和实例部分之间分离,使得他们之间可以独立变化,将继承关系转化为关联关系,降低了类与类之间的耦合度,减少了类的数量同时也减少了代码量。
桥接模式--定义
由上面的导读我们可以知道:
桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。
其中抽象化:是将各个具有相同的属性的事物抽象为一个具体的类,例子中的神和身体便是抽象类。
实现化指的是:将抽象出来的属性变成具体的事物,就是例子中的惩罚产生的东西。
桥接模式--结构
下图是桥接模式的UML结构图:
桥接模式主要包含如下几个角色:
Abstraction:抽象类。
RefinedAbstraction:扩充抽象类。
Implementor:实现类接口。
ConcreteImplementor:具体实现类 。
桥接模式--代码实现
god.java
package Bridge_Pattren; /** * 要惩罚的神 * @author xyxy001 * */ public abstract class God { //在god中要留下对body的引用 public Body body; //神的名字 public String name; //神的职位 public String job; //性别 public String sex; public void setBody(Body body){ this.body=body; } public abstract void rencarnation(); }
Body.java
package Bridge_Pattren; /** * 要罚成投胎的地方 * @author xyxy001 * */ public interface Body { public void doRencarnation(String GodName); }
package Bridge_Pattren; public class MokeySun extends God { public MokeySun(String name,String job,String sex){ this.name=name; this.job=job; this.sex=sex; } public void rencarnation() { body.doRencarnation(name); } }
dog.java具体投胎的地方
package Bridge_Pattren; /** * 投狗胎的地方 * @author xyxy001 * */ public class Dog implements Body { public void doRencarnation(String GodName) { System.out.println(GodName+":投胎狗身"); } }
horse.java
package Bridge_Pattren; public class Horse implements Body{ @Override public void doRencarnation(String GodName) { System.out.println(GodName+":投胎马身"); } }
client.java用于模拟玉帝
package Bridge_Pattren; public class Client { public static void main(String args[]){ MokeySun mokeysun=new MokeySun("孙悟空","养马","男"); //玉帝让孙悟空投狗胎 Body body=new Dog(); //投马胎 Body body2=new Horse(); mokeysun.setBody(body); mokeysun.rencarnation(); mokeysun.setBody(body2); mokeysun.rencarnation(); } }
运行效果
桥接模式--优缺点
优点:
1、分离抽象接口及其实现部分。提高了比继承更好的解决方案。
2、桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
3、实现细节对客户透明,可以对用户隐藏实现细节。
缺点
1、桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
2、桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。
桥接模式--使用场景
1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以 使它们在抽象层建立一个关联关系。
2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。