Java学习-设计模式-桥接模式
概念:
桥接模式即将抽象部分与它的实现部分分离开来,使他们都可以独立变化。
桥接模式将继承关系转化成关联关系,它降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量。
**优点: **
- 分离抽象接口及其实现部分。提高了比继承更好的解决方案。
- 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
- 实现细节对客户透明,可以对用户隐藏实现细节。
**缺点: **
-
桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
-
桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。
使用场景: 1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。 2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。 3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
理解:
概念可能有点模糊,我学习的时候也是,不过多看两遍学习代码之后接清楚了。
简单描述一下:(学习时看到的例子,没有想到比这刚好的例子,就借用一下)
假设我们需要画图,图形有很多中,比如三角形、正方形、圆形、长方形等等。颜色也有很多种,比如红色、绿色、蓝色等等,我们不可能说去定义一个红色三角形,然后又去定义一个蓝色三角形,再定义一个绿色三角形,这样下去太冗余了。而且才定义一个图形,图形和颜色多了就会很乱。
这时我们把颜色和图形拆开。
1. 先定义一个颜色的接口A1,然后用各种需要用到的颜色去实现它,
2. 再定义一个图形的抽象类B1,包含一个接口A1的属性,构造方法中初始化话这个属性(即指定颜色),还包含一个绘图的抽象方法,
3. 然后让各个图形去实现B1,分别转换为三角形类,正方形类等等,重写抽象方法,使用B1初始化中的颜色和当前的类的图形来绘画。
这样就解决了图形和颜色耦合的问题。这就是桥接模式。
示例:
package Practices.Mode.Bridge;
// 1. 先定义一个关于颜色的接口
public interface Color {
public void show_Color();
}
package Practices.Mode.Bridge;
// 2. 然后创建颜色的实现类去实现颜色接口
public class Red_Color implements Color {
public void show_Color() {
System.out.println("当前颜色是红色!");
}
}
package Practices.Mode.Bridge;
// 2. 然后创建颜色的实现类去实现颜色接口
public class Green_Color implements Color {
public void show_Color() {
System.out.println("当前颜色是绿色!");
}
}
package Practices.Mode.Bridge;
// 3. 在定义一个图形的抽象类,包含一个颜色的接口的属性,构造方法初始化它,还有一个画图的抽象方法
public abstract class Shape {
protected Color color;
public Shape(Color color) {
this.color = color;
}
public abstract void Drowing();
}
package Practices.Mode.Bridge;
// 4. 继承图形的抽象类,重写其的抽象方法
public class Triangle extends Shape {
public Triangle(Color color) {
super(color);
}
public void Drowing() {
color.show_Color();
System.out.println("当前图形是三角形");
}
}
package Practices.Mode.Bridge;
// 4. 继承图形的抽象类,重写其的抽象方法
public class Square extends Shape {
public Square(Color color) {
super(color);
}
public void Drowing() {
color.show_Color();
System.out.println("当前图形是正方形!");
}
}
package Practices.Mode.Bridge;
// 5. 测试
public class Test_main {
public static void main(String[] args) {
Shape triangle = new Triangle(new Red_Color());
Shape square = new Square(new Green_Color());
triangle.Drowing();
square.Drowing();
}
}