java设计模式之桥模式
2016-06-20 13:50
656 查看
转载的网址:http://www.cnblogs.com/wyang0126/p/5039946.html
桥梁(Bridge)模式 :又称Handle/Body。将抽象部分和实现部分分离,使它们都可以独立的变化。桥梁模式属于对象的结构模式。
GOF桥梁模式的示意性结构类图如下:
通过上图可以看出桥梁模式有以下角色:
抽象化(Abstraction)角色 :给出抽象化定义并持有一个实现化对象的引用。
修正抽象化(Refined Abstraction)角色 :扩展抽象化角色,改变和修正父类对抽象化的定义。
实现化(Implementor)角色 :给出实现化的接口角色的接口,但不给出具体的实现。
具体实现化(Concrete Implementor)角色 :给出实现化角色接口的具体实现。
桥梁模式在于将抽象和实现分离(也就是我们常说的解耦),让抽象和实现能够独立变化。来举个例子:抽象的车,有火车和汽车,而火车有客车和火车,也就是能运货物和人;汽车也是如此,能运货物和运客人。我们可以如下建立模型:
这种模式将车的属性和行为分类,让车 和运输相互独立演变,类的数量由原来的M*N变成M+N的数量,利用组合方式代替继承,这也符合‘组合聚合复用原则’,组合聚合复用原则讲的是要尽可能使用组合、聚合来达到复用目的而不是利用继承。对于增加一个运输方式或者增加一个车的种类,直接添加即可,不必修改其他类,也只需修改一处即可。
上述描述代码如下:
这种模式将车的属性和行为分类,让车 和运输相互独立演变,类的数量由原来的M*N变成M+N的数量,利用组合方式代替继承,这也符合‘组合聚合复用原则’,组合聚合复用原则讲的是要尽可能使用组合、聚合来达到复用目的而不是利用继承。对于增加一个运输方式或者增加一个车的种类,直接添加即可,不必修改其他类,也只需修改一处即可。上述描述代码如下:
运行结果如下:
火车运货
火车运客
汽车运货
汽车运客
通过上面代码可以看出,桥梁模式有如下优点:
1、分离接口及实现部分 一个实现不必一直绑定在一个接口上;
2、提高可扩充性,使扩展变得简单;
桥梁(Bridge)模式 :又称Handle/Body。将抽象部分和实现部分分离,使它们都可以独立的变化。桥梁模式属于对象的结构模式。
GOF桥梁模式的示意性结构类图如下:
通过上图可以看出桥梁模式有以下角色:
抽象化(Abstraction)角色 :给出抽象化定义并持有一个实现化对象的引用。
修正抽象化(Refined Abstraction)角色 :扩展抽象化角色,改变和修正父类对抽象化的定义。
实现化(Implementor)角色 :给出实现化的接口角色的接口,但不给出具体的实现。
具体实现化(Concrete Implementor)角色 :给出实现化角色接口的具体实现。
桥梁模式在于将抽象和实现分离(也就是我们常说的解耦),让抽象和实现能够独立变化。来举个例子:抽象的车,有火车和汽车,而火车有客车和火车,也就是能运货物和人;汽车也是如此,能运货物和运客人。我们可以如下建立模型:
这种模式将车的属性和行为分类,让车 和运输相互独立演变,类的数量由原来的M*N变成M+N的数量,利用组合方式代替继承,这也符合‘组合聚合复用原则’,组合聚合复用原则讲的是要尽可能使用组合、聚合来达到复用目的而不是利用继承。对于增加一个运输方式或者增加一个车的种类,直接添加即可,不必修改其他类,也只需修改一处即可。
上述描述代码如下:
这种模式将车的属性和行为分类,让车 和运输相互独立演变,类的数量由原来的M*N变成M+N的数量,利用组合方式代替继承,这也符合‘组合聚合复用原则’,组合聚合复用原则讲的是要尽可能使用组合、聚合来达到复用目的而不是利用继承。对于增加一个运输方式或者增加一个车的种类,直接添加即可,不必修改其他类,也只需修改一处即可。上述描述代码如下:
package bridge; /** * *作者:alaric *时间:2013-8-2上午7:41:31 *描述:车的抽象类 */ public abstract class Vehicle { private Transport implementor; public void transport(){ implementor.transport(); } public Transport getImplementor() { return implementor; } public void setImplementor(Transport implementor) { this.implementor = implementor; } }
package bridge; /** * *作者:alaric *时间:2013-8-2上午7:45:40 *描述:汽车的实现类 */ public class Car extends Vehicle { @Override public void transport() { System.out.print("汽车"); super.transport(); } }
package bridge; /** * *作者:alaric *时间:2013-8-2上午7:45:58 *描述:火车的实现类 */ public class Train extends Vehicle { @Override public void transport() { System.out.print("火车"); super.transport(); } }
package bridge; /** * *作者:alaric *时间:2013-8-2上午7:46:17 *描述:车的实现接口 */ public interface Transport { /** * *作者:alaric *时间:2013-8-2上午7:46:38 *描述:运输 */ public void transport(); }
package bridge; /** * *作者:alaric *时间:2013-8-2上午7:41:00 *描述:货车 */ public class Goods implements Transport{ @Override public void transport() { System.out.println("运货"); } }
package bridge; /** * *作者:alaric *时间:2013-8-1下午10:58:25 *描述:客车 */ public class Guest implements Transport{ @Override public void transport() { System.out.println("运客"); } }
package bridge; /** * *作者:alaric *时间:2013-8-2上午7:45:24 *描述:测试类 */ public class Client { /** *作者:alaric *时间:2013-8-2上午7:45:16 *描述: */ public static void main(String[] args) { //造出一辆火车来 Train train = new Train(); //装入货物 train.setImplementor(new Goods()); //运输 train.transport(); //上客 train.setImplementor(new Guest()); //运输 train.transport(); //造出一汽车来 Car car = new Car(); //装入货物 car.setImplementor(new Goods()); //运输 car.transport(); //上客 car.setImplementor(new Guest()); //运输 car.transport(); } }
运行结果如下:
火车运货
火车运客
汽车运货
汽车运客
通过上面代码可以看出,桥梁模式有如下优点:
1、分离接口及实现部分 一个实现不必一直绑定在一个接口上;
2、提高可扩充性,使扩展变得简单;
相关文章推荐
- java实现比较版本号
- Java基础,字节字符
- java初始化顺序
- Spring MVC POST中文乱码解决方案
- java弱引用
- Java算法 归并排序
- 解析Java的四种引用
- Java反射—自己实现Bean的拷贝
- 【深入理解java虚拟机 JVM】Java内存结构
- Java多线程编程
- JavaSE入门学习50:多线程编程(一)
- JavaSE入门学习51:多线程编程(二)
- Java文件操作类
- Java的随机验证码生成类
- Java工具类——数字计算工具 NumberUtil
- 【转】Java工具类——Money转换工具MoneyUtil
- java io流中怎么在一个文本中追加字符串
- 【转】Java工具类——数组操作ArrayUtil
- 【转】Java工具类——资源文件解析类PropertiesUtil
- 【转】Java工具类——资源文件解析类PropertiesUtil