设计模式-桥接模式

  1. 桥接模式(Bridge Pattern)

将抽象部分与它的实现部分分离,使它们都可以独立地变化。

以下一些情况使用桥接模式:

  • 你不希望在抽象和它的实现之间有一个固定的绑定关系。
  • 类的抽象以及它们的实现都应该可以通过生成子类的方法加以补充,这时桥接模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。
  • 对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。
  • (C++)你想对客户完全隐藏抽象的实现部分,在C++中,类的表示在类接口中是可见的。
  • 你想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。

 1c298fed58fbced268a44eaa44018b3450f.jpg

 

 436ccd3215b4d4cfa8b87604bcf9fff388b.jpg

 

示例:

DrawingAPI.java

public interface DrawingAPI {

    public void drawCircle(final double x, final double y, final double radius);

}

DrawingAPI1.java

public class DrawingAPI1 implements DrawingAPI {

    public void drawCircle(final double x, final double y, final double radius) {

        System.out.printf("API1.circle at %f:%f radius %f%n", x, y, radius);

    }

}

DrawingAPI2.java

public class DrawingAPI2 implements DrawingAPI {

    public void drawCircle(final double x, final double y, final double radius) {

        System.out.printf("API2.circle at %f:%f radius %f%n", x, y, radius);

    }

}

Shape.java

abstract class Shape {

    protected DrawingAPI drawingAPI;



    protected Shape(final DrawingAPI drawingAPI){

        this.drawingAPI = drawingAPI;

    }



    public abstract void draw();                                 // low-level

    public abstract void resizeByPercentage(final double pct);   // high-level

}

 

CricleShape.java

public class CircleShape extends Shape {

    private double x, y, radius;

    public CircleShape(final double x, final double y, final double radius, final DrawingAPI drawingAPI) {

        super(drawingAPI);

        this.x = x;  this.y = y;  this.radius = radius;

    }



    // low-level i.e. Implementation specific

    public void draw() {

        drawingAPI.drawCircle(x, y, radius);

    }

    // high-level i.e. Abstraction specific

    public void resizeByPercentage(final double pct) {

        radius *= (1.0 + pct/100.0);

    }

}

BridgePattern.java

public class BridgePattern {

    public static void main(final String[] args) {

        Shape[] shapes = new Shape[] {

                new CircleShape(1, 2, 3, new DrawingAPI1()),

                new CircleShape(5, 7, 11, new DrawingAPI2())

        };



        for (Shape shape : shapes) {

            shape.resizeByPercentage(2.5);

            shape.draw();

        }

    }

}

 

转载于:https://my.oschina.net/u/3963977/blog/2985821

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值