您的位置:首页 > 其它

常用设计模式总结--桥接模式

2011-06-11 13:19 357 查看
桥接模式,
bridge
模式。

如果你是一个
linux
的爱好者,也许你会发现
linux
下有两套不太一样的桌面环境,一个是
KDE
,一个是
GNOME
。如果现在你要开发一个
linux
的桌面应用程序,估计你也会觉得头大,为每个桌面环境单独写一个程序么,那样显然不就一个聪明的主意,意味着你的任意一个改动,另外一个也必须做出对应的变化。这个时候,
bridge
模式就能派上用场了。

Bridge
模式能将抽象部分与实现部分完全分离,从而让它们各自演化。

Windows
下自然也会出现这样的问题,那我们常用的显示器分辨率来说吧,常用的分辨率有
800x600

1027x768

1600x900
,那在不同的分辨率下,字符的渲染是不一样的。

桥接模式的优点

1)分离了接口和实现部分,二者独立演化

2)提高了可扩充性

3)细节对于客户来说透明

来看看具体的类图



来看看具体实现的代码

1) Window类

package zl.study.designpattern.bridge;
/**
* 窗口的基类,屏幕上显示的东东都可以抽象成一个Window
* @author peter
*
*/
public abstract class Window {
public abstract void drawContent();

protected WindowImp getWindowImp(){
if( null == imp){
imp = WindowSystemFactory.INSTANCE.makeWindowImp();
}
return imp;
}

WindowImp imp;
}


2) TextWindow类

package zl.study.designpattern.bridge;
public class TextWindow extends Window {
private String content;

public TextWindow(String content ){
this.content = content;
}

@Override
public void drawContent() {
getWindowImp().deviceText(content, new Point(100,100));
}

}


3) IconWindow类

package zl.study.designpattern.bridge;
public class IconWindow extends Window{
private String path;
public IconWindow(String path){
this.path = path;
}
@Override
public void drawContent() {
getWindowImp().deviceBitmap(path, new Point(200,200), new Point(400,400));

}
}


4) WindowImp类

package zl.study.designpattern.bridge;
/**
* Window的实现类
* @author peter
*
*/
public interface WindowImp {
public void deviceText(String content,Point point);
public void deviceBitmap(String path,Point origin,Point end);
}


5) SmallWindowImp类

package zl.study.designpattern.bridge;
/**
* 小型显示设备,eg.分辨率 800 * 600
* @author peter
*
*/
public class SmallWindowImp implements WindowImp{
@Override
public void deviceBitmap(String path, Point origin, Point end) {
System.out.println("<small>"+ path);
}

@Override
public void deviceText(String content, Point point) {

System.out.println("[small]"+ content +"[coordinate]"+point.x+"//"+ point.y+"[/coordinate][/small]");

}

}


6) MiddleWindowImp类

package zl.study.designpattern.bridge;
/**
* 中型显示设备,eg.分辨率 1024 * 768
* @author peter
*
*/
public class MiddleWindowImp implements WindowImp{
@Override
public void deviceBitmap(String path, Point origin, Point end) {

System.out.println("<middle>"+ path);
}
@Override
public void deviceText(String content, Point point) {
System.out.println("[middle]"+ content +"[coordinate]"+point.x+"//"+ point.y+"[/coordinate][/middle]");
}

}


7) BigWindowImp类

package zl.study.designpattern.bridge;
/**
* 大型显示设备,eg.分辨率 1600 * 900 还是小宽屏
* @author peter
*
*/
public class BigWindowImp implements WindowImp{
@Override
public void deviceBitmap(String path, Point origin, Point end) {
System.out.println("<big>"+ path);
}
@Override
public void deviceText(String content, Point point) {

System.out.println("[big]"+ content +"[coordinate]"+point.x+"//"+ point.y+"[/coordinate][/big]");
}

}


8) WindowSystemFactory类

需要说明一下,这是一个Window的辅助类,用来模拟在不同的窗口之间切换

package zl.study.designpattern.bridge;
import java.util.Random;
/**
* 模拟类,模拟返回不同的显示终端
* @author peter
*
*/
public class WindowSystemFactory {
public WindowImp makeWindowImp(){
WindowImp imp = null;

Random rand = new Random(System.currentTimeMillis());
int num = rand.nextInt(2);
switch( num){
case 0:
{
imp = new SmallWindowImp();
break;
}
case 1:
{
imp = new MiddleWindowImp();
break;
}
case 2:
{
imp = new BigWindowImp();
break;
}
}
return imp;

}
public static WindowSystemFactory INSTANCE = new WindowSystemFactory();
}


最后,来看下测试程序

package zl.study.designpattern.bridge.test;
import zl.study.designpattern.bridge.TextWindow;
import zl.study.designpattern.bridge.Window;
/**
* 桥接模式的测试程序
* @author peter
*
*/
public class BridgeTest {
public static void main(String args[]) throws Exception{
Window text1 = new TextWindow("Bridge Pattern!");
text1.drawContent();
Thread.sleep(1000);
Window text2 = new TextWindow("Bridge Pattern!");
text2.drawContent();
Thread.sleep(1000);
Window text3 = new TextWindow("Bridge Pattern!");
text3.drawContent();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: