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("新增的一种发送方式");
}
}
相关文章推荐
- 学习练习 java 线程
- javacript获取当前屏幕大小
- [leetcode-343]Integer Break(java)
- 【Java】---java对象中的4中引用类型
- 学习总结 java线程
- Java 分支结构 - if...else/switch
- HDU2088JAVA2
- HDU2088JAVA
- java response 输出js
- JAVA中字符编码研究
- java.lang.UnsatisfiedLinkError: Couldn’t load locSDK3: findLibrary returned null.
- Java之日期和时间的计算
- 详解Java中用于国际化的locale类
- 死磕Spring AOP系列2:剖析Bean处理器之BeanNameAutoProxyCreator
- Spring事务的配置详解:AOP配置数据库操作的事务
- Java 开发中static 和 final 关键字
- Java千百问_03基础语法(013)_>、>>、>>>有什么区别
- 深入Java核心 Java内存分配原理精讲
- 7款开源Java反编译工具
- Java千百问_02基本使用(008)_eclipse如何关闭代码验证