桥接模式的目的是:分离抽象化和实现,使两者的接口可以不同,目的是分离。
桥接模式的角色有:
实现(Implementor):定义具体行为,具体特征的应用接口。
具体实现(ConcreteImplementor):实现Implementor。
目标接口(Target): 包含实现具体行为、具体特征的Implementor接口或者类。
桥接模式通过在Target里的操作,调用Implementor得操作,达到了Target的抽象与Implementor实现的分离。
如例程:Painter(Target)有画图形DrawShape操作,Painter里面包含了Shape(Implementor)接口,Painter的实现类RefinedPainter在自己的DrawShape操作中调用Shape的Draw和Paint操作。
通过例子,在来看看桥接模式起到的作用。在开发的时候设定Target和Implementor采用桥接机制,这样使得Target和Implementor的后续的接口定义和参数定义上有比较大的灵活度。打个比方,生成洗衣机有两个部门,一个是水管链接器,一个是生产进水管的。水管链接器部门就启动桥接模式,它告诉进水管生产部门,不用担心连不上,你们生成什么粗细的水管,都可以连上水龙头。这就在一开始就给生产进水管的部门很多自由度,实现了分离。
桥接模式与适配器模式在代码实现上是相同的。差别在于适配器模式是已经有一个进水管和家用水龙头存在了,这时候生产一个接头来连接进水管和水龙头,这个接头就是适配器。桥接是定下生产接头策略,再让进水管有开发的自由度。只是先后的问题。
试着写段程序:
- //Shape类
- abstract class Shape{
- public abstract void Draw();
- public abstract void Paint();
- }
- //具体工厂(每个具体工厂负责一个具体产品)
- class Circle extends Shape{
- public void Draw(){
- printfln("Draw Circle");
- }
- public void Paint(){
- printfln("Paint Circle");
- }
- }
- class Triangle extends Shape{
- public void Draw(){
- printfln("DrawTriangle ");
- }
- public void Paint(){
- printfln("PaintTriangle ");
- }
- }
- public abstract class Painter{
- private Shape SP;
- public SetImplementor(Shape sp){
- SP = sp;
- }
- public void DrawShape();
- }
- public class RefinedPainter extends Painter
- public void DrawShape(){
- SP.Draw();
- SP.Paint();
- }
- }
- //测试
- public class Test{
- public static void main(String[] args){
- RefinedPainter refinedPainter = new RefinedPainter ();
- refinedPainter.SetImplementor(new Circle());
- refinedPainter.DrwaShape();
- refinedPainter.SetImplementor(new Triangle());
- refinedPainter.DrwaShape();
- }
- }