首页 > 其他 > 详细

图片浏览器的接口设计-桥接模式的运用

时间:2014-03-28 19:35:02      阅读:509      评论:0      收藏:0      [点我收藏+]

一    桥接模式的结构

        bubuko.com,布布扣

二    解析桥接模式

       

?可以看出,这个系统含有两个等级结构:

1)由抽象化角色和修正抽象化角色组成的抽象化等级结构。

2)由实现化角色和具体实现化角色组成的实现化等级结构。

?桥接模式涉及的角色有:

1)抽象化角色(Abstraction):抽象化给出定义,并保存一个实现化对象的引用。

2)修正抽象化角色(Refined Abstraction):扩展抽象化角色,改变父类对抽象化的定义。

3)实现化角色(Implementor):这个角色给出实现化的接口,但不给出具体的实现。必须指出的是,这个接口可以与抽象化角色的接口非常不一样。实现化角色应当只给出底层的操作,而抽象化角色应当给出基于底层操作的更高一层的操作。

4)具体实现化(ConcreteImplementor)角色:给出实现化角色接口的具体实现。


三    应用实例

1.    问题描述

?一个图像格式有两个基本的方面,一是结构,二是表象。其结构决定了图像是怎样存储的,而其表象决定了图像是怎样显示在屏幕上的。对于一个图像格式(BMPJPG等)来说,其结构在任何一种操作系统中都是不变的,而其表象在每个操作系统中都有所不同。比如说,WindowsBitmap文件在所有的操作系统中都是不变的,而每个操作系统把Bitmap图像显示在屏幕上的机制都有所不同。另一方面,一个操作系统怎样显示一个图像的机制与图像的格式无关。比如,Windows系统总是要把一个图像表示为一个Bitmap图像,而不管此图像的源格式。
简单地说,图像的结构和表现是两个不同的地方,应该让它们独立地根据操作系统的不同而不同,桥接模式正好可以在此发挥作用。请给出一个示意性的图像浏览器系统,以说明桥接模式的用法。


2.     UML

bubuko.com,布布扣

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.    运行结果

bubuko.com,布布扣


6.    附件下载

下载地址  :  http://download.csdn.net/detail/wwwzys/7111033








图片浏览器的接口设计-桥接模式的运用,布布扣,bubuko.com

图片浏览器的接口设计-桥接模式的运用

原文:http://blog.csdn.net/wwwzys/article/details/22379853

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!