每天一个(设计模式)-- Bridge模式(桥接模式)

对于一个初学者来说,往往容易滥用类。一切皆类,所以,类在设计中便爆炸般增长了。
对于这类问题,我们有很多模式来解决,但是我认为根本的还是要搞清楚,什么时候可以创建一个新的类。Martin大叔的 重构,Kent大叔的TDD,都给我们提出了一些解决方法。

这里我们不讨论这么高深的问题,而是从GOF的设计模式入手,来看看,类是如何泛滥,又是如何通过桥接来解决的。这也正是面向对象中的关键之处。

桥接,顾名思义,在接口与实现之间,架设一座桥梁,这座桥,其实并非是为了过河,而是隔离接口与实现。这就是著名的OO原则:DIP,ISP,依赖倒置(细节依赖抽象,抽象不依赖细节,接口隔离)。下面看桥接的UML:


[img]http://dl.iteye.com/upload/attachment/0065/4868/f9489ad7-8893-39c5-b59c-e896d9f0cb72.jpg[/img]


例子还是从形状说起。每个形状都要求能绘制自己。我们有很多形状,很多画法。
首先我们定义一个接口。shape
public interface Shape {
public void draw();
}


于是,你接下来怎么做?各种实现,例如:

public class Circle implements Shape{

private int x;
private int y;
private int r;
public Circle(int x, int y, int r){
this.x = x;
this.y = y;
this.r = r;
}
@Override
public void draw() {
// TODO Auto-generated method stub
//invoke the draw method

JFrame frame = new JFrame();
Graphics g = frame.getGraphics();
g.drawOval(x, y, r, r);
}

}


于是,需求又要画Rectangle了。我们继续写Rectangle,然后还要画Polygon,
这没什么问题,也就是类多一点,但是都是必须的。
继续,用户突然要我们画一个同心圆了。再编码完后,你可能发现,所有这些draw函数中,我们重复了太多的代码。不要紧,我们继续,这时候,客户举得应该有铅笔画的形状和钢笔画的形状,这下怎么办? 没有一种形状再加上绘图用的工具吧。现在是时候抽象了。

首先抽象出一个Drawing的接口,我们使用这个接口来作为绘图的抽象类。这样不需要每次都要实际的绘图。这里需要注意的是,我们如果直接使用draw来作为接口,那么这个粒度太大,因为实际中的绘制,可能会分成很多的步骤和细节,于是我们就在接口处,设置最小的粒度,这样,更能适应不同需求。

public interface Drawing {
public void drawLine();
public void drawCircle();
}

这里简化为画直线和圆。
有了接口,我们就看看有些什么不同的实现吧。要绘制,我们先选用铅笔:

public class PencilDraw implements Drawing{

@Override
public void drawLine() {
// TODO Auto-generated method stub
//This line is drawn by pencil
System.out.println("pencil is drawing a line...");
//do drawing
}

@Override
public void drawCircle() {
// TODO Auto-generated method stub
//This circle is drawn by pencil
System.out.println("pencil is drawing a circle...");
//do drawing
}

}


这里,做了很多简化。实际的绘制,可能使用原有系统,可能需要提供绘制参数等等。

最后,我们看看如何使用:


public static void main(String args[]){
Drawing draw = new PencilDraw();
Shape rec = new Rectangle(draw);
rec.draw();
}

这样的好处是,对于已经存在的形状,他们并不需要关心谁来绘制他们,而是使用绘制接口。
也就是只针对接口,而不是具体的细节。

这就是桥接模式。使用一个接口,封装了具体的实现。这些实现在使用的时候可以灵活替换(LSP原则),更重要的是,当有新的需求时,我们只是使用新的实现替换一下老的实现,就可以了,而无需改变原来的形状的接口(OCP原则)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值