您的位置:首页 > 编程语言 > Java开发

java设计模式之桥接模式

2016-06-04 09:40 337 查看

1.应用场景

举个例子,铅笔和钢笔,都可以用来写字和画画。邮局可以邮寄信件和包裹,两者都有平邮和挂号邮寄两种功能。明白使用场景后,我们可以提取主要元素:事物和功能。

可以这样定义:有一类事务的集合,{A1,A2,A3...},每个事物都具有功能F1,F2,F3。当然会有个功能的集合{F1,F2,F3...}。在计算机的世界里我们如何表示呢,代码如下:

public class 信件{

public void 平邮(){}

public void 挂号(){}

}

public class 包裹{

public void 平邮(){}

public void 挂号(){}

}

每个事物是一个类,有m个事物,就有m个类,每个类有n个功能,一共下来有m*n个功能。显然,这种方法是不可取的。

2.桥接模式概念

桥接模式是关于怎么将抽象部分和它的实现部分分离,使它们都可以独立变化。像之前那种写法,会有大量的重复的代码。

3.解决办法

利用语义(所以语文学好是关键 呐),对于平邮和挂号,它们是邮局发送的两种方式,所以一句话:邮局有发送功能,我们就可以先得到一个接口,代码如下:

package qj_1;

public interface iPost {//邮局

public void send();//发送功能

}

有了这个接口后,我们当然想着的是它的实现类了。

//平邮实现类

package qj_1;

public class Pmail implements iPost{

@Override

public void send() {

System.out.println("平邮发送。。");

}

}

//挂号实现类

package qj_1;

public class Gmail implements iPost{

@Override

public void send() {

System.out.println("挂号发送。。");

}

}

以上我们解决了问题的一半:邮局有平邮和挂号两种功能。信件和包裹,是两种不同的事物,它们有相同的功能,当然也有不同的。对于它们共同的部分我们可以将其封装到一个类中,但是该类又不能代替一个具体的事物,所以我们可以将其定义为抽象类。

package qj_1;

public abstract class AbstractThing {// 抽象类

private iPost post;// 多态成员

public AbstractThing(iPost obj) {

post = obj;

}

public void post() {// 平邮和挂号两种功能

post.send();

}

}

该抽象类是桥接模式的核心。重点是在该类中定义了多态成员,发送的两种方式是信件和包裹共享的功能。接下的就很明确了,信件和包裹两个具体的事物去继承抽象类。

package qj_1;

//信件实现类

public class Letter extends AbstractThing{

public Letter(iPost obj) {

super(obj);

}

//其他独有的变量和方法

}

package qj_1;

//包裹实现类

public class Parcel extends AbstractThing{

public Parcel(iPost obj) {

super(obj);

}

//其他独有的变量和方法

}

测试类代码如下:

package qj_1;

public class Test {

public static void main(String[] str) {

iPost post = new Gmail();

Letter letter = new Letter(post);

letter.post();

}

}

4.分析总结

从测试类中我们可以看出,先功能类中选择一种发送方式,然后再在事物类中选择一种具体的事物类,然后完成发送任务。所以可以总结,桥接模式完成的是一个多条件选择问题,假设有二维条件,分别有N1,N2个选择,桥接模式就是要求在一维的条件中选一个条件,再在二维的条件中选一个,完成有效的组合。这种情景在生活中很常见,比如,10件上衣10件裤子,你想搭配出一套衣服,你肯定会上衣摆出一排,在其中选一件,裤子摆出一排,在其中选一件。而不是衣服裤子混在一起挑。你从家里到长春,必须经过中转站北京,从家到北京好多路线和方式,从北京到长春同样很多路线,你肯定从家到北京的路线先选择一条,从北京到长春的路线选一条,完成从家到北京这个事。

当需求发生变化时,桥接模式是如何满足的呢?

当添加了新的事物,从抽象类中派生一个类即可。

package qj_1;

public class NewThing extends AbstractThing{

public NewThing(iPost obj) {

super(obj);

}

//其他独有的变量和方法

}

当添加了新的发送方式,从接口派生出一个类即可。

package qj_1;

public class NewMail implements iPost{

@Override

public void send() {

System.out.println("新增的一种发送方式");

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: