读书人

java桥接方式

发布时间: 2012-08-24 10:00:21 作者: rapoo

java桥接模式

?1、核心意图:将抽象部分和实现部分分离,使它们都可以独立的变化。该模式的目标是通过把高层的抽象和底层的实现分开,分别构建自己的类层次结构,并通过实现部分的接口将两部分进行桥接,从而达到高层抽象和底层实现可以独立的方便扩展的目的。其核心是分离,和委托。?2、身边实例:Java语言的一个非常重要的特点是平台的无关性,对于一般的高级语言所编写的程序,如果要在不同的平台上运行,为了适应不同平台所带来的指令集及数据类型等所带来的差异,至少需要编译成不同的目标代码。Java语言通过Java虚拟机实现了平台的无关性,虚拟机通过对底层平台指令集及数据类型等进行统一的抽象,针对不同的平台用不同的虚拟机进行实现,这样Java应用程序就可以通过编译成符合虚拟机规范的字节码文件,而在不同的平台上都能正确运行。这里的虚拟机正是桥接模式一个很好的展示,它隔离了底层实现(指令/数据类型等)和高层的应用程序,对于新开发的每个Java应用程序,都只需要编译一次;而对于一个新平台的支持,也仅需提供一个相应的Java虚拟机,就可以使所有应用系统正确运行。Java应用程序及虚拟机的大体结构图如下:?java桥接方式3、动机简述:在该模式的动机中,描述了一个平台可移植的用户界面工具箱,在该工具箱中会有多种窗口Window类型,为了实现平台的可移植性,把窗口的实现部分从窗口类型中抽取出来,构成一个独立的窗口实现WindowImp类层次,从而使得抽象窗口和窗口实现都可以独立变化,以便于支持新的窗口类型和平台实现。?4、模式效果:桥接Bridge模式有两个主要效果:1)通过分离抽象部分和实现部分,使两者可以独立变化;2)向客户隐藏了实现部分,从而当需要扩展/更改实现部分时,不需要重新编译客户代码。对于效果1),当抽象部分和实现部分比较多样时,可以显著的减少类的种类,并提高代码的灵活性。假定高层抽象和底层实现分别有5种类型,如果不采用桥接模式,而用继承实现,那么就需要5*5=25个类(另有一个抽象类);如果采用桥接模式,将抽象部分和实现部分分离,就只需要5+5=10个类就可以(另有两个抽象类),两种实现的类如以下表格中所示:?继承方式实现:

?

?ImplementorImp1Imp2Imp3Imp4Imp5AbstractionAbs1Abs1Imp1Abs1Imp2Abs1Imp3Abs1Imp4Abs1Imp5Abs2Abs2Imp1Abs2Imp2Abs2Imp3Abs2Imp4Abs2Imp5Abs3Abs3Imp1Abs3Imp2Abs3Imp3Abs3Imp4Abs3Imp5Abs4Abs4Imp1Abs4Imp2Abs4Imp3Abs4Imp4Abs4Imp5Abs5Abs5Imp1Abs5Imp2Abs5Imp3Abs5Imp4Abs5Imp5?桥接模式实现:

?

?ImplementorImp1Imp2Imp3Imp4Imp5AbstractionAbs1通过桥接关联Abs2Abs3Abs4Abs5?5、Java代码示例:下面代码演示了一个支持不同平台的图形对象应用,图形Shape有多种类型,如三角形正方形等,为了在不同平台中实现图形的绘制,把实现部分进行了分离,构成了ShapeImp类层次结构,包括在Windows中的ShapeImpWin,和Unix中的ShapeImpUnix,类结构图如下:?java桥接方式代码清单如下:类Point,同上一篇文章《设计模式》之Java解读--适配器Adapter中所示,表示画面中的一个点坐标?java桥接方式package?qinysong.pattern.bridge;
java桥接方式
java桥接方式public?class?Point?{
java桥接方式
java桥接方式??private?int?coordinateX;
java桥接方式??private?int?coordinateY;
java桥接方式
java桥接方式??public?Point(int?coordinateX,?int?coordinateY){
java桥接方式????this.coordinateX?=?coordinateX;
java桥接方式????this.coordinateY?=?coordinateY;
java桥接方式??}
java桥接方式??public?String?toString(){
java桥接方式????return?"Point[x="?+?coordinateX?+?",y="?+?coordinateY?+?"]";
java桥接方式??}
java桥接方式??public?int?getCoordinateX()?{
java桥接方式????return?coordinateX;
java桥接方式??}
java桥接方式??public?int?getCoordinateY()?{
java桥接方式????return?coordinateY;
java桥接方式??}
java桥接方式}
java桥接方式?类ShapeImp,实现接口(对应Implementor),这里只是画一条直线?java桥接方式package?qinysong.pattern.bridge.implement;
java桥接方式
java桥接方式import?qinysong.pattern.bridge.Point;
java桥接方式
java桥接方式public?interface?ShapeImp?{
java桥接方式??public?void?drawLine(Point?startPoint,?Point?endPoint);
java桥接方式}
java桥接方式?类ShapeImpWin,实现接口的Windows实现类(对应ConcreteImplementor)?java桥接方式package?qinysong.pattern.bridge.implement;
java桥接方式
java桥接方式import?qinysong.pattern.bridge.Point;
java桥接方式
java桥接方式public?class?ShapeImpWin?implements?ShapeImp?{
java桥接方式
java桥接方式??/**
java桥接方式???*?实现ShapeImp接口方法
java桥接方式???*?@param?startPoint?Point
java桥接方式???*?@param?endPoint?Point
java桥接方式???*/
java桥接方式??public?void?drawLine(Point?startPoint,?Point?endPoint)?{
java桥接方式????System.out.println("ShapeImpWin.drawLine?startPoint="?+?startPoint?+?",endPoint="?+?endPoint);
java桥接方式??}
java桥接方式}
java桥接方式?类ShapeImpUnix,实现接口的Unix实现类(对应ConcreteImplementor)?java桥接方式package?qinysong.pattern.bridge.implement;
java桥接方式
java桥接方式import?qinysong.pattern.bridge.Point;
java桥接方式
java桥接方式public?class?ShapeImpUnix?implements?ShapeImp?{
java桥接方式
java桥接方式??/**
java桥接方式???*?实现ShapeImp接口方法
java桥接方式???*?@param?startPoint?Point
java桥接方式???*?@param?endPoint?Point
java桥接方式???*/
java桥接方式??public?void?drawLine(Point?startPoint,?Point?endPoint)?{
java桥接方式????System.out.println("ShapeImpUnix.drawLine?startPoint="?+?startPoint?+?",endPoint="?+?endPoint);
java桥接方式??}
java桥接方式}
java桥接方式?类Shape,图形抽象类(对应Abstraction),具体类型包括三角形、正方形等?java桥接方式package?qinysong.pattern.bridge.abstraction;
java桥接方式
java桥接方式import?qinysong.pattern.bridge.implement.ShapeImp;
java桥接方式import?qinysong.pattern.bridge.ShapeImpFactory;
java桥接方式
java桥接方式public?abstract?class?Shape?{
java桥接方式
java桥接方式??protected?ShapeImp?shapeImp;
java桥接方式??protected?void?initShapeImp(){
java桥接方式????shapeImp?=?ShapeImpFactory.getShapeImp();
java桥接方式??}
java桥接方式
java桥接方式??//定义图形抽象类的接口方法
java桥接方式??public?abstract?void?drawShape();
java桥接方式
java桥接方式}
java桥接方式?类Triangle,三角形(对应RefinedAbstraction)?java桥接方式package?qinysong.pattern.bridge.abstraction;
java桥接方式
java桥接方式import?qinysong.pattern.bridge.Point;
java桥接方式
java桥接方式public?class?Triangle?extends?Shape{
java桥接方式
java桥接方式??//实现抽象图形类Shape接口方法,绘制一个三角形
java桥接方式??public?void?drawShape()?{
java桥接方式????System.out.println("Triangle.drawShape?绘制一个三角形...");
java桥接方式????initShapeImp();
java桥接方式????shapeImp.drawLine(new?Point(0,0),?new?Point(10,0));
java桥接方式????shapeImp.drawLine(new?Point(0,0),?new?Point(5,10));
java桥接方式????shapeImp.drawLine(new?Point(5,10),?new?Point(10,0));
java桥接方式??}
java桥接方式}
java桥接方式?类Square,正方形(对应RefinedAbstraction)?java桥接方式package?qinysong.pattern.bridge.abstraction;
java桥接方式
java桥接方式import?qinysong.pattern.bridge.Point;
java桥接方式
java桥接方式public?class?Square?extends?Shape{
java桥接方式
java桥接方式??//实现抽象图形类Shape接口方法,绘制一个正方形
java桥接方式??public?void?drawShape()?{
java桥接方式????System.out.println("Square.drawShape?绘制一个正方形...");
java桥接方式????initShapeImp();
java桥接方式????shapeImp.drawLine(new?Point(0,0),?new?Point(10,0));
java桥接方式????shapeImp.drawLine(new?Point(0,0),?new?Point(0,10));
java桥接方式????shapeImp.drawLine(new?Point(0,10),?new?Point(10,10));
java桥接方式????shapeImp.drawLine(new?Point(10,0),?new?Point(10,10));
java桥接方式??}
java桥接方式}
java桥接方式?类Client,桥接模式的客户?java桥接方式package?qinysong.pattern.bridge;
java桥接方式
java桥接方式import?qinysong.pattern.bridge.abstraction.Shape;
java桥接方式import?qinysong.pattern.bridge.abstraction.Square;
java桥接方式import?qinysong.pattern.bridge.abstraction.Triangle;
java桥接方式
java桥接方式public?class?Client?{
java桥接方式
java桥接方式??public?static?void?main(String[]?args)?{
java桥接方式????System.out.println("Client.main?begin?..........");
java桥接方式????Shape?shape?=?new?Square();
java桥接方式????shape.drawShape();
java桥接方式????Shape?shape2?=?new?Triangle();
java桥接方式????shape2.drawShape();
java桥接方式
java桥接方式????System.out.println("Client.main?end???..........");
java桥接方式??}
java桥接方式}
java桥接方式?类ShapeImpFactory,工厂类,供抽象部分调用,分离实现类的创建过程?java桥接方式package?qinysong.pattern.bridge;
java桥接方式
java桥接方式import?qinysong.pattern.bridge.implement.ShapeImp;
java桥接方式import?qinysong.pattern.bridge.implement.ShapeImpWin;
java桥接方式
java桥接方式public?class?ShapeImpFactory?{
java桥接方式??public?static?ShapeImp?getShapeImp(){
java桥接方式????return?new?ShapeImpWin();
java桥接方式??}
java桥接方式}

读书人网 >软件架构设计

热点推荐