桥接模式
来源:互联网 发布:免费的交友软件 编辑:程序博客网 时间:2024/05/22 06:19
桥接模式:将某个问题抽象的不同形式分别与该问题的具体实现部分相分离,使他们都可以独立变化,并能够动态结合。
从上图可以看出,将实际抽象分离出来。
看下代码
//生产厂商TelevisionMaker作为Television的成员变量,它也是抽象类,但是它的具体
实现和Television的实现相分离,并且能和Television动态结合
//电视机抽象类
- public
abstract class Television { -
-
TelevisionMaker televisionMaker; -
-
public void teleview(TelevisionMaker televisionMaker); - }
//生产厂商抽象类
- public
abstract class TelevisionMaker { -
public void produce(); - }
//电视机的型号,21英寸
- public
class Inch21 extendsTelevision{ -
-
void teleview(TelevisionMaker televisionMaker) { -
System.out.println( -
} -
- }
//电视机的型号,29英寸
- public
class Inch29 extendsTelevision{ -
-
void teleview(TelevisionMaker televisionMaker) { -
System.out.println( -
} -
- }
//电视机的具体生产厂商,长虹
public
-
-
ChangHong(){ -
System.out.println( -
} -
-
void produce() { -
System.out.println( -
} - }
//电视机的具体生产厂商,海尔
- public
class Haier extendsTelevisionMaker{ -
Haier(){ -
System.out.println( -
} -
-
void produce() { -
System.out.println( -
} -
- }
这样就使用了桥模式,将原本繁杂的系统分离开来。如果根据需求变动,要增加电视机生产型号或者电视机生产厂商,只需要实现相对应的抽象类即可。
这样,我们也可以根据用户的需要,得到他所需要的电视机,如长虹厂商出厂的29寸电视机。
测试代码如下:
- public
class Client { -
-
static void main(String[] args) { -
TODO Auto-generated method stub -
Inch29 i = Inch29(); -
i.teleview( ChangHong()); -
} - }
《设计模式》中对桥接模式的定义为:
将抽象部分与它的实现部分分离,使他们可以独立地变化。别名为:Handle/Body。
Bridge模式是构造型的设计模式之一。Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任。它的主要特点是把抽象(abstraction)与行为实现(implementation)分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展。
结构如下图所示:
例子代码如下:
//定义一个事物的抽象,维护对行为实现(Implementor)的引用
//Shape抽象类
public abstract class Shape {
protected Drawing myDrawing;
abstract public void draw();
Shape(Drawing drawing) {
myDrawing = drawing;
}
public void drawLine() {
myDrawing.drawLine();
}
public void drawCircle() {
myDrawing.drawCircle();
}
}
//Circle具体类
public class Circle extends Shape{
Circle(Drawing drawing) {
super(drawing);
}
@Override
public void draw() {
myDrawing.drawCircle();
}
}
//Rectangle 具体类
public class Rectangle extends Shape {
Rectangle(Drawing drawing) {
super(drawing);
}
@Override
public void draw() {
myDrawing.drawLine();
myDrawing.drawLine();
drawLine();
}
}
//实现部分的抽象,Drawing抽象类
public abstract class Drawing {
public abstract void drawLine();
public abstract void drawCircle();
}
//V1Drawing具体类
public class V1Drawing extends Drawing {
@Override
public void drawCircle() {
DP1.draw_a_circle();
}
@Override
public void drawLine() {
DP1.draw_a_line();
}
}
//V2Drawing具体类
public class V2Drawing extends Drawing{
@Override
public void drawCircle() {
DP2.draw_a_circle();
}
@Override
public void drawLine() {
DP2.draw_a_line();
}
}
public class DP1 {
public static void draw_a_line() {
System.out.println("使用DP1的draw_a_line()画线");
}
public static void draw_a_circle() {
System.out.println("使用DP1的draw_a_circle()画圆");
}
}
public class DP2 {
public static void draw_a_line() {
System.out.println("使用DP2的draw_a_line()画线");
}
public static void draw_a_circle() {
System.out.println("使用DP2的draw_a_circle()画圆");
}
}
//测试类
public class BridgeClient {
public static void main(String args[]) {
Drawing draw1 = new V1Drawing();
Drawing draw2 = new V2Drawing();
Shape shape1 = new Rectangle(draw1);
shape1.draw();
Shape shape2 = new Circle(draw2);
shape2.draw();
Shape shape3 = new Circle(draw1);
shape3.draw();
}
}
输出结果:
使用DP1的draw_a_line()画线
使用DP1的draw_a_line()画线
使用DP1的draw_a_line()画线
使用DP2的draw_a_circle()画圆
使用DP1的draw_a_circle()画圆
Bridge模式的优点:
1 分离接口及其实现部分。
2 提高可扩充性。
3 实现细节对客户透明。
- 设计模式:适配器模式,桥接模式
- 设计模式----桥接模式
- 设计模式---桥接模式
- 结构性模式-桥接模式
- 设计模式:桥接模式
- 设计模式 桥接模式
- 设计模式 - 桥接模式
- 设计模式--桥接模式
- 设计模式--桥接模式
- 设计模式 - 桥接模式
- 设计模式-桥接模式
- 设计模式 - 桥接模式
- 设计模式 - 桥接模式
- 【设计模式-桥接模式】
- 设计模式:桥接模式
- 【设计模式】----桥接模式
- 【设计模式】桥接模式
- 设计模式--桥接模式
- [Redis] redis-cli 命令总结
- opencv基本数据类型
- Sybase数据库工具DbVisualizer乱码问题
- 在mac osx10.8.5 xcode5.1上编译ffmpeg
- poj2503
- 桥接模式
- 内核中的种种延时同步
- UVA - 424 Integer Inquiry
- maven jdk版本设置
- 获取当前ios设备的内存使用情况,获取客户端ip地址
- 引用
- 人的一生就是一个储蓄的过程
- java.util.logging.Logger基础教程
- 设置部分文件不适用ARC机制