<其它设计模式介绍及案例源码下载 >
简介:桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。
主要解决:实现系统可能有多个角度分类,每一种角度有多种可能会变化的情况下用继承会造成类爆炸问题,扩展起来不灵活,那么把这种多角度分类给分离出来让他们独立变化,减少他们之间耦合。
优点: 1、抽象和实现的分离。 2、优秀的扩展能力。 3、实现细节对客户透明。
缺点:桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
使用场景: 1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。 2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。 3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
实现案例:对人所吃的食物描述有三个维度,分别是人种(HumanTypeAbs)、味道(Taste)和形态(Form),人种具体分为中国人Chinese、美国人American,味道分为咸的Salty、甜的Sweet,形态分为固态Solid、液态Liquid。通过以抽象类HumanTypeAbs为聚合体,在其中声明味道和形态的引用,将人种、味道、形态实现聚合,从而实现三个不同維度的組合描述。
注意:这里一直强调的 “抽象化与实现化分离” 不是说抽象类与其派生子类进行分离,而是将两个角色之间的原本的继承关系变成这里的关联关系(聚合)。例如:需求是使形态为固体的食物,新加一个味道的描述,这是从“形态”和“味道”两个维度对食物进行的描述,原先的做法是由原先的固体食物类派生出一个固体的、咸的食物子类来,这样如果再多几种形态和味道的话,子类总个数就会变成m*n个,这就是所谓的类爆炸。而在桥接模式中,会将形态和味道两个维度进行抽象,并对其各自派生子类进行组合使用,这样可以根据需要进行搭配实现食物“形态”,“味道”的组合描述,而不需要生成指定描述的子类来
例如下:
public interface Form {
public void forms();
}
public class Liquid implements Form {
@Override
public void forms() {
System.out.println("形态是液体的");
}
}
public class Solid implements Form {
@Override
public void forms() {
System.out.println("形态是固体的");
}
}
public interface Taste {
public void tasteDes();
}
public class Sweet implements Taste {
@Override
public void tasteDes() {
System.out.print("味道是甜的");
}
}
public class Salty implements Taste {
@Override
public void tasteDes() {
System.out.println("味道是咸的");
}
}
public abstract class HumanTypeAbs {
protected Form form;
protected Taste taste;
public HumanTypeAbs(Form form,Taste taste) {
this.form=form;
this.taste=taste;
}
public abstract void eatType();
}
public class Chinese extends HumanTypeAbs {
public Chinese(Form form, Taste taste) {
super(form, taste);
// TODO Auto-generated constructor stub
}
@Override
public void eatType() {
System.out.println("中国人喜欢吃的食物:");
form.forms();
taste.tasteDes();
}
}
public class American extends HumanTypeAbs {
public American(Form form, Taste taste) {
super(form, taste);
// TODO Auto-generated constructor stub
}
@Override
public void eatType() {
System.out.println("美国人喜欢吃的食物:");
form.forms();
taste.tasteDes();
}
}
public class TestClass {
public static void main(String[] args) {
Form f=new Liquid();
Form f2=new Solid();
Taste t=new Salty();
Taste t2=new Sweet();
HumanTypeAbs chinese=new Chinese(f2,t);
HumanTypeAbs american=new American(f,t2);
chinese.eatType();
american.eatType();
}
}