设计模式《桥接模式》
2018-07-24 本文已影响0人
天道__
引言
咋一看这个模式,看的一头懵逼,纯概念很来理解。举个例子吧 就像一座桥,链接两端。先回顾上一节的装饰模式,下面我们来细说这个桥接模式。
示例地址
类图
image定义
将抽象部分与实现部分分离,使它们都可以独立进行变化。
使用场景
从模式的定义中我们大致可以了解到,这里"桥梁"的作用其实就是连接“抽象部分”与“实现部分”,但是事实上,任何多维度变化类或者说多个树状类之间的耦合都可以使用桥接模式来实现解耦。
如果一个系统需要在构建的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,可以通过桥接模式使他们在抽象层建立一个关联关系。
对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,也可以考虑用桥接模式。
一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
桥接模式示例
我们在使用ppt画图的时候,可以绘制圆形、正方形、三角形。
然后我们一个填充不同的颜色,例如白色、黑色、红色。这样就生成了3*3=9种,如果我们按照继承的方式实现的话。要生成9个类,如果我多一种颜色的话,就需要重新写3个类。
继承方式实现
1. 定义形状类
/**
* 形状
*
* @author 512573717@qq.com
* @created 2018/7/27 下午4:03.
*/
public abstract class Shape {
public abstract void draw();
}
2. 正方形的实现
/**
* 正方形
*
* @author 512573717@qq.com
* @created 2018/7/27 下午4:06.
*/
public class Square extends Shape {
@Override
public void draw() {
System.out.println("正方形");
}
}
3. 圆形的实现
/**
* 圆形
*
* @author 512573717@qq.com
* @created 2018/7/27 下午4:05.
*/
public class Circle extends Shape {
@Override
public void draw() {
System.out.println("圆形");
}
}
4. 白色的正方形
/**
* 白色的正方形
*
* @author 512573717@qq.com
* @created 2018/7/27 下午4:10.
*/
public class WhiteSquare extends Square {
@Override
public void draw() {
System.out.print("白色的");
super.draw();
}
}
5. 红色的正方形
/**
* 红色的正方形
*
* @author 512573717@qq.com
* @created 2018/7/27 下午4:11.
*/
public class RedSquare extends Square {
@Override
public void draw() {
System.out.print("红色的");
super.draw();
}
}
6. 白色的圆形
/**
* 白色的圆形
*
* @author 512573717@qq.com
* @created 2018/7/27 下午4:07.
*/
public class WhiteCircle extends Circle {
@Override
public void draw() {
System.out.print("白色的");
super.draw();
}
}
7. 红色的圆形
/**
* 红色的圆形
*
* @author 512573717@qq.com
* @created 2018/7/27 下午4:09.
*/
public class RedCircle extends Circle {
@Override
public void draw() {
System.out.print("红色的");
super.draw();
}
}
8. Client
// 方式一 通过继承
WhiteSquare whiteSquare = new WhiteSquare();
whiteSquare.draw();
WhiteCircle whiteCircle = new WhiteCircle();
whiteCircle.draw();
9. 缺点
1. 采用了多层继承结构,导致系统中类的个数急剧增加,系统扩展麻烦。
2. 不利于扩展,增加一个新的颜色图形时,需要新增类。
桥接模式
1. 定义形状类
/**
* 形状
*
* @author 512573717@qq.com
* @created 2018/7/27 下午3:27.
*
*/
public abstract class Shape {
protected IColor mIColor;
public void setIColor(IColor IColor) {
mIColor = IColor;
}
public abstract void draw();
}
2. 颜色接口
/**
* 颜色的接口
*
* @author 512573717@qq.com
* @created 2018/7/27 下午3:29.
*
*/
public interface IColor {
void getColor();
}
3. 圆形
/**
* 圆形
*
* @author 512573717@qq.com
* @created 2018/7/27 下午3:38.
*/
public class Circle extends Shape {
@Override
public void draw() {
mIColor.getColor();
System.out.println("圆形...");
}
}
4. 正方形
/**
* 正方形
*
* @author 512573717@qq.com
* @created 2018/7/27 下午3:39.
*
*/
public class Square extends Shape {
@Override
public void draw() {
mIColor.getColor();
System.out.println("正方形...");
}
}
5. 白色的实现
/**
* 白色
*
* @author 512573717@qq.com
* @created 2018/7/27 下午3:38.
*
*/
public class WhiteColor implements IColor {
@Override
public void getColor() {
System.out.print("白色的");
}
}
6. 红色的实现
/**
* 红色
*
* @author 512573717@qq.com
* @created 2018/7/27 下午3:35.
*
*/
public class RedColor implements IColor {
@Override
public void getColor() {
System.out.print("红色的");
}
}
7. Client
//方式二:桥接模式
//白色
IColor white = new WhiteColor();
//白色的正方形
Shape square = new Square();
square.setIColor(white);
square.draw();
//白色的圆形
Shape circle = new Circle();
circle.setIColor(white);
circle.draw();
总结
1. 分离抽象接口及其实现部分。所谓抽象和实现沿着各自维度的变化,也就是说抽象和实现不再在同一个继承层次结构中,而是“子类化”它们,使它们各自都具有自己的子类,以便任何组合子类,从而获得多维度组合对象。
2. 桥接模式提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统,符合“开闭原则”。