一 桥接模式的结构
二 解析桥接模式
(1)由抽象化角色和修正抽象化角色组成的抽象化等级结构。
(2)由实现化角色和具体实现化角色组成的实现化等级结构。
(1)抽象化角色(Abstraction):抽象化给出定义,并保存一个实现化对象的引用。
(2)修正抽象化角色(Refined Abstraction):扩展抽象化角色,改变父类对抽象化的定义。
(3)实现化角色(Implementor):这个角色给出实现化的接口,但不给出具体的实现。必须指出的是,这个接口可以与抽象化角色的接口非常不一样。实现化角色应当只给出底层的操作,而抽象化角色应当给出基于底层操作的更高一层的操作。
(4)具体实现化(ConcreteImplementor)角色:给出实现化角色接口的具体实现。
三 应用实例
1. 问题描述
2. UML
3. 解析
设计两个抽象类 PicViewer 和 PicViewerImplementer 后这为前者的一个属性(桥接)
每个类中都包含抽象方法;就是show() , showImp() ;其中show()调用了PicViewerImplementer 的showImp()方法。
这样做的目的是 解决实现上的多重组合问题 ,例如 BmpViewer , JpgViewer等M个查看器 需要 MAC Windows Linux ... N个系统不同的显示 则 需要 实现 N*M个版本,
这样细粒度的类,管理起来是十分麻烦的,而且容易混乱。
通过桥接模式顺利的将 N*M个版本分解为 N+M 的实现。
桥接模式的好处显露无疑。
4. 代码
为方便期间使用C#代码:
PicViewer.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace PicViewer { public abstract class PicViewer { private PicViewerImplementator imp; public PicViewerImplementator Imp { get { return imp; } set { imp = value; } } abstract public void show(); } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace PicViewer { class BmpViewer : PicViewer { public override void show() { Console.WriteLine("this is a bmp format!"); base.Imp.showImp(); } } }
JpgViewer.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace PicViewer { class JpgViewer : PicViewer { public override void show() { Console.WriteLine("this is a jpg format!"); base.Imp.showImp(); } } }
下面是不同OS的实现
PicViewerImplementator.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace PicViewer { public abstract class PicViewerImplementator { abstract public void showImp() ; } }
WindowsPicViewerImp.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace PicViewer { class WindowsPicViewerImp:PicViewerImplementator { public override void showImp() { Console.WriteLine("Windows System Implemenet Pictuer Show"); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace PicViewer { class MacPicViewerImp : PicViewerImplementator { public override void showImp() { Console.WriteLine("Mac System Implemenet Pictuer Show"); } } }
LinuxPicViewerImp.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace PicViewer { class LinuxPicViewerImp : PicViewerImplementator { public override void showImp() { Console.WriteLine("Linux System Implemenet Pictuer Show"); } } }
Program.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace PicViewer { class Program { static void Main(string[] args) { PicViewer pic = new BmpViewer(); PicViewer pic1 = new JpgViewer(); PicViewerImplementator imp1 = new MacPicViewerImp() ; PicViewerImplementator imp2 = new WindowsPicViewerImp() ; PicViewerImplementator imp3 = new LinuxPicViewerImp() ; pic.Imp = imp1; pic.show(); pic.Imp = imp2; pic.show(); pic.Imp = imp3; pic.show(); pic1.Imp = imp1; pic1.show(); pic1.Imp = imp2; pic1.show(); pic1.Imp = imp3; pic1.show(); Console.Read(); } } }
5. 运行结果
6. 附件下载
下载地址 : http://download.csdn.net/detail/wwwzys/7111033
图片浏览器的接口设计-桥接模式的运用,布布扣,bubuko.com
原文:http://blog.csdn.net/wwwzys/article/details/22379853