1.桥接
1.1定义
桥接模式:将抽象部分与它的实现部分解耦,使得两者都能够独立变化。
对象结构型模式
桥接模式的定义说明:
-
又被称为柄体(Handle and Body)模式或接口(Interface)模式
-
用抽象关联取代了传统的多层继承
-
将类之间的静态继承关系转换为动态的对象组合关系
1.2角色
桥接模式包含以下4个角色:
- Abstraction(抽象类)
- RefinedAbstraction(扩充抽象类)
- Implementor(实现类接口)
- ConcreteImplementor(具体实现类)
1.3优点
- 分离抽象接口及其实现部分
- 可以取代多层继承方案,极大地减少了子类的个数
- 提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,不需要修改原有系统,符合开闭原则
1.4缺点
- 会增加系统的理解与设计难度,由于关联关系建立在抽象层,要求开发者一开始就针对抽象层进行设计与编程
- 正确识别出系统中两个独立变化的维度并不是一件容易的事情
1.5适用环境
- 需要在抽象化和具体化之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系
- 抽象部分和实现部分可以以继承的方式独立扩展而互不影响
- 一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立地进行扩展
- 不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统
1.6教学例子
(1)分析:
-
蜡笔:颜色和型号两个不同的变化维度(即两个不同的变化原因)耦合在一起,无论是对颜色进行扩展还是对型号进行扩展都势必会影响另一个维度
-
毛笔:颜色和型号实现了分离,增加新的颜色或者型号对另一方没有任何影响
(2)类图:
(3)代码:
Abstraction(抽象类)
public abstract class BrushPen {
protected Color color;
public void setColor(Color c){
color = c;
}
public abstract void paint();
}
RefinedAbstraction(扩充抽象类)
public class BigBrushPen extends BrushPen {
@Override
public void paint() {
System.out.println("画一条大号的线条。");
if(color != null){
color.tint();
}
}
}
Implementor(实现类接口)
public interface Color {
public void tint();
}
ConcreteImplementor(具体实现类)
public class GreenColor implements Color {
@Override
public void tint() {
System.out.print("给它着色为绿色.");
}
}
public class RedColor implements Color {
@Override
public void tint() {
System.out.print("给它着色为红色.");
}
}
Client(客户端)
public class Client {
public static void main(String[] args) {
//购买颜料和笔
Color green = new GreenColor();
BrushPen bigBP = new BigBrushPen();
//用笔蘸上颜料
bigBP.setColor(green);
//用笔画画
bigBP.paint();
}
}
1.7实操案例
(1)问题:
在某图形绘制软件中提供了多种不同类型的图形(shape),例如圆形(circle),三角形(triangle),长方形(rectangle)等,并为每种图形提供了多种样式,例如平面(plane)图形,立体(stereo)图形等,该软件需经常增加新的图形及新的图形样式,其初始设计方案如下:
请结合面向对象设计原则分析该设计方案存在的问题,一种合适的设计模式对该方案进行重构,并画出类图后模拟实现。
(2)类图:
(3)代码:
Abstraction(抽象类)
public abstract class Shape {
protected Style s;
public void setS(Style s) {
this.s = s;
}
public abstract void draw();
}
RefinedAbstraction(扩充抽象类)
public class Circle extends Shape {
@Override
public void draw() {
// TODO Auto-generated method stub
System.out.println("绘制一个圆形");
this.s.show();
}
}
public class Rectangle extends Shape {
@Override
public void draw() {
// TODO Auto-generated method stub
System.out.println("绘制一个长方形");
this.s.show();
}
}
public class Triangle extends Shape {
@Override
public void draw() {
// TODO Auto-generated method stub
System.out.println("绘制一个三角形");
this.s.show();
}
}
Implementor(实现类接口)
public interface Style {
public void show();
}
ConcreteImplementor(具体实现类)
public class Plane implements Style {
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("这是一个平面图像");
}
}
public class Stereo implements Style {
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("这是一个立体图像");
}
}
Client(客户端)
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
Shape s = new Circle();
Style st = new Plane();
Style st2 = new Stereo();
s.setS(st);
s.draw();
s.setS(st2);
s.draw();
}
}