桥接模式即将抽象部分与它的实现部分分离开来,使他们都可以独立变化。
桥接模式将继承关系转化成关联关系,它降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量。
将抽象部分与他的实现部分分离这句话不是很好理解,其实这并不是将抽象类与他的派生类分离,而是抽象类和它的派生类用来实现自己的对象。
优点: 1、抽象和实现的分离。 2、优秀的扩展能力。 3、实现细节对客户透明。
缺点:桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
使用场景: 1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。 2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。 3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
注意事项:对于两个独立变化的维度,使用桥接模式再适合不过了。
UML图
例子实现:
public abstract class Shape {
Color color;
public void setColor(Color color) {
this.color = color;
}
public abstract void draw();
}
//然后是三个形状 。
//圆形 Circle.java :
//实例
public class Circle extends Shape{
public void draw() {
color.bepaint("正方形");
}
}
//长方形 Rectangle.java :
//实例
public class Rectangle extends Shape{
public void draw() {
color.bepaint("长方形");
}
}
//正方形 Square.java :
//实例
public class Square extends Shape{
public void draw() {
color.bepaint("正方形");
}
}
//颜色接口 Color.java :
//实例
public interface Color {
public void bepaint(String shape);
}
//白色 White.java :
//实例
public class White implements Color{
public void bepaint(String shape) {
System.out.println("白色的" + shape);
}
}
//灰色 Gray.java :
//实例
public class Gray implements Color{
public void bepaint(String shape) {
System.out.println("灰色的" + shape);
}
}
//黑色 Black.java :
//实例
public class Black implements Color{
public void bepaint(String shape) {
System.out.println("黑色的" + shape);
}
}
//客户端 Client.java :
//实例
public class Client {
public static void main(String[] args) {
//白色
Color white = new White();
//正方形
Shape square = new Square();
//白色的正方形
square.setColor(white);
square.draw();
//长方形
Shape rectange = new Rectangle();
rectange.setColor(white);
rectange.draw();
}
}
既然两个维度可以的话,那我们设想一些是不是三个维度也是适合的呢,以一个为主类,然后为他增添其他的功能,这个是颜色,然后形状,大小,。。。。不知道和装饰者区别在哪里,待我看完装饰者模式再来讨论一下!
看了几篇文章说的他们的区别都很含糊,可能我的理解能力有问题,但是突然自己总结出来那其中的区别,桥接模式是组合不同维度的需要的特征,意思就是有几个维度就需要几个特征。
而装饰者模式呢,他是有无数个属性可以选择,选择几个是我的自由。
应该差不多,如果后面发现有什么不对,会再来修改。