桥接模式
抽象产品
产品A类包含a1和a2两种具体的
产品B类包含b1和b2两种具体的
组合产品包含一个A产品和一个B产品
抽象建造工厂生产一个组合产品
如果用建造者模式将产生2*2四个具体的工厂,如a1 b1 / a2 b2/
a1 b2/a2 b1,随着类型增加将指数增长
桥接模式,可以将B类做为变量放进A类中,A类变成带有b1或b2的产品,A类在生产具体产品a1或a2后可以设置选择带b1或b2
桥接模式和组合模式的区别,在于元素之间是嵌套关联的,
如下例子中,图片类型中包含操作系统变量
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BridgeSample
{
//辅助像素矩阵类
class Matrix
{
//
}
//抽象操作系统实现显示类
interface ImageImp
{
void DoPaint(Matrix m);
}
//windows操作系统实现类
class WindowsImp:ImageImp
{
public void DoPaint(Matrix m)
{
Console.WriteLine("在Windows中显示图像");
}
}
//在linux中显示图像
class LinuxImp : ImageImp
{
public void DoPaint(Matrix m)
{
Console.WriteLine("在linux中显示图像");
}
}
//抽象图像类
abstract class Image
{
protected ImageImp imp;
public void SetImageImp(ImageImp imp)
{
this.imp = imp;
}
public abstract void ParseFile(string FileName);
}
//具体图像类--当作扩充抽象类
class JPGImage :Image
{
public override void ParseFile(string FileName)
{
Matrix m = new Matrix();
imp.DoPaint(m);
Console.WriteLine($"{FileName}" + "格式为JPG");
}
}
//具体图像类--当作扩充抽象类
class PNGImage : Image
{
public override void ParseFile(string FileName)
{
Matrix m = new Matrix();
imp.DoPaint(m);
Console.WriteLine($"{FileName}" + "格式为PNG");
}
}
class Program
{
static void Main(string[] args)
{
ImageImp imp = new WindowsImp();
Image image = new PNGImage();
image.SetImageImp(imp);
image.ParseFile("桥接模式");
Console.ReadLine();
}
}
}