初探桥接模式
在开始学java的时候老师讲到继承的时候,总是喜欢用一个例子来讲解,那就是画图,这里有一个画笔,可以画正方形、长方形、圆形(这个大家都知道怎么做吧,我就不解释了)。但是现在我们需要给这些形状进行上色,这里有三种颜色:白色、灰色、黑色。这里我们可以画出3*3=9中图形:白色正方形、白色长方形、白色圆形。。。。。。到这里了我们几乎到知道了这里存在两种解决方案:
方案一:为每种形状都提供各种颜色的版本。
方案二:根据实际需要对颜色和形状进行组合。
方案一
对于中两个图形,我们都会很清楚这样一个问题:假入我们添加椭圆,我们是不是又要增加三种颜色呢?假如我们在增加一个绿色,我们就要增加其四种形状了,继续加。继续加……每次增加都会增加若干个类(如果增加颜色则会增加形状个数个类,若增加形状则会增加颜色个数个类),这样的情况我想每个程序员都不会想要吧!那么我们看方案二。
方案二
方案二所提供的就是解决方法是:提供两个父类一个是颜色、一个形状,颜色父类和形状父类两个类都包含了相应的子类,然后根据需要对颜色和形状进行组合
对于方案二这种思想方法我们叫做 桥接模式
了解桥接模式
现有Color 和 Shape两个类别的东东,Shape可能是Circle,Triangle …,Color 可能是Red,Green…,所谓桥接就是将Color和Shape组合,桥接;
优点:
1、抽象和实现的分离。 2、优秀的扩展能力。 3、实现细节对客户透明
"1.抽象与实现分离"
----->放在后面理解
缺点:
桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
桥接模式实例
抽象层
桥接接口Color
package bridge_pattern_about.myunderstand;
public interface Color {
void paint(String shapeType);
// String getColor();
}
抽象类Shape
package bridge_pattern_about.myunderstand;
public abstract class Shape {
Color color;
// 桥接点,每new一个Shape,会对应一个特定的桥接接口Color
// 抽象层面的每个Shape对应接口Color共笛卡尔积个Shape和Color的组合
// 即共计Math(Shape.Color)个组合
public Shape(Color color) {
this.color = color;
}
public abstract void draw();
// public abstract void drawBySelf();
}
可见在抽象层组合的方式和轮廓已经完成,接下来交给实现类区完成即可
实现层
Shape实现类
package bridge_pattern_about.myunderstand;
public class Circle extends Shape {
private String shapeType = "Circle";
// private String colorType = color.getColor();
public Circle(Color color) {
super(color);
}
@Override
public void draw() {
super.color.paint(shapeType);
}
/**
@Override
public void drawBySelf() {
System.out.println(shapeType + " : " + colorType + " at:<" + this.getClass() + ">");
}*/
}
Color桥接实现类
package bridge_pattern_about.myunderstand;
public class Red implements Color {
// String colorType = "red";
@Override
public void paint(String shapeType) {
System.out.println(shapeType + " : " + colorType + " at:<" + this.getClass() + ">");
}
/*
@Override
public String getColor() {
return colorType;
}*/
}
客户测试类BridgePatternDemo
package bridge_pattern_about.myunderstand;
public class BridgePatternDemo {
public static void main(String[] args) {
Shape circle = new Circle(new Red());
circle.draw();
// circle.drawBySelf();
// Shape triangle = new Triangle(new Green());
// triangle.draw();
}
}
对一些代码进行了注释,其实是做了一些简单的测试:Color和Shape进行组合,那么可以是Shape将自己的信息拿给Color,让Color进行组合搭配输出,也可以是Shape主动向Color索要信息,自己进行搭配输出
实际上Color和Shape怎么组合早在抽象层就已经是设计好了,抽象层需要什么就去找实现类去要即可----->抽象与实现分离
去掉代码部分的相关注释运行结果如下
运行结果
Circle : red at:<class bridge_pattern_about.myunderstand.Red>
Circle : red at:<class bridge_pattern_about.myunderstand.Circle>
Triangle : green at:<class bridge_pattern_about.myunderstand.Green>