一 桥接模式的结构
二 解析桥接模式
(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();
}
}
BmpViewer.cs
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");
}
}
}
MacPicViewerImp.cs
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.youkuaiyun.com/detail/wwwzys/7111033