C#设计模式07-桥接模式

桥接模式,从字面意思上说就是用一条桥梁来链接两个不同的事物。专业一点讲,就是当一个类存在独立变化的两个维度的时候,可以将这两个维度分离出,设计成独立的继承结构,使他们可以独立扩展。桥接模式用一种巧妙的方式(用抽象关联代替传统的多重继承)解决了多重继承存在的问题。

假如说现在要开发一个图像浏览系统,要求可以显示JPG,PNG,GIF等格式的图像,同时系统要跨平台,要求能在Windows,Unix,Linux等操作系统下面展示,不同的操作系统可以把不同的图片转换成像素矩阵,然后在系统中显示,这个时候我们可以理解成浏览系统(类)里面有两个独立变换的维度,一个是图像格式,一个操作系统,他们都可以独立扩展。这个时候为了保证系统的扩展性和灵活性,就可以采用桥接模式来连接这两个独立变化的维度。如果把这两个维度写在一起,用传统的继承方式解决的话,系统的扩展性会很差。

接下来看看系统的类图吧



C#设计模式07-桥接模式_第1张图片

我们给不同格式的图片抽象了一个父类,给不同的操作系统抽象了一个父类,客户端针对Image编程,一般情况下Image类是抽象类。然后看一下具体的代码吧

显示Image类和它的子类的代码

    abstract class Image//客户端针对它编程
    {
        protected ImageImp imp;
        public void SetImage(ImageImp imp)
        {
            this.imp = imp;
        }
        public abstract void ShowImage();
    }

    class GIFImage:Image
    {
        public override void ShowImage()
        {
            imp.DoPaint();//调用不同的操作系统的中函数来绘制像素矩阵
            Console.WriteLine("像素矩阵绘制完毕了,格式为GIF");
        }
    }
    class BMPImage:Image
    {
        public override void ShowImage()
        {
            imp.DoPaint();//调用不同的操作系统的中函数来绘制像素矩阵
            Console.WriteLine("像素矩阵绘制完毕了,格式为BMP");
        }
    }
    class JPGImage:Image
    {
        public override void ShowImage()
        {
            imp.DoPaint();//调用不同的操作系统的中函数来绘制像素矩阵
            Console.WriteLine("像素矩阵绘制完毕了,格式为JPG");
        }
    }
    class PNGImage:Image
    {
        public override void ShowImage()
        {
            imp.DoPaint();//调用不同的操作系统的中函数来绘制像素矩阵
            Console.WriteLine("像素矩阵绘制完毕了,格式为BMP");
        }
    }
然后是操作系统的父类和不同的操作系统
    interface ImageImp
    {
        void DoPaint();
    }
    class WindowsImp:ImageImp
    {
        public void DoPaint()
        {
            Console.WriteLine("在windows操作系统中显示图像啦!");
        }
    }
    class UnixImp:ImageImp
    {
        public void DoPaint()
        {
            Console.WriteLine("在Unix操作系统中显示图像啦!");
        }
    }
    class LinuxImp:ImageImp
    {
        public void DoPaint()
        {
            Console.WriteLine("在Linux操作系统中显示图像啦!");
        }
    }
最后使我们的客户端代码,客户端通过反射动态加载图像类和操作系统类,并以接口或者抽象类的方式返回。
    class Program
    {
        static void Main(string[] args)
        {
            Image img;
            ImageImp imp;
            string imageType = ConfigurationManager.AppSettings["imageName"];
            string osType = ConfigurationManager.AppSettings["osName"];
            img = Assembly.Load("桥接模式").CreateInstance(imageType) as Image;
            imp = Assembly.Load("桥接模式").CreateInstance(osType) as ImageImp;
            img.SetImage(imp);
            img.ShowImage();
            Console.ReadLine();
        }
    }
来看看运行结果吧

C#设计模式07-桥接模式_第2张图片
在Image子类中,我们设置了操作系统为Linux系统,然后调用Linux的DoPaint方法绘制像素矩阵,最后在系统中显示,但让我们只是简单模拟了一下。这样的话,通过在Image类中保留一个ImageImp类的引用(也即是抽象关联)来使这两个独立变化的维度产生联系,并且可以独立扩展。

桥接模式就介绍到这里了。桥接模式的适用场景就是当系统中存在两个独立变化的维度,并且要求我们独立对他们进行扩展而相互之间不受影响。并且它将方法的实现延迟到子类中去。但桥接模式的使用要求我们必须准确的识别出这两个独立变化的维度,这是非常困难的,并且需要有一定的经验积累。

本博文参考了C#设计模式这本书写的,在此表示感谢!

接下来会给大家介绍组合模式,敬请期待!




你可能感兴趣的:(C#设计模式)