设计模式学习之路(六) ------ 桥接模式(bridge)

  • 理论基础:http://blog.csdn.net/cooldragon/article/details/52173915

UML类图:   

                   

原型实现:

       当多种图形使用不同图形程序接口来进行绘制时,比如有球形/正方体/胶囊体等等,使用openGl和DirectX来进行绘制,如果每个要绘制的图形都拥有绘制类和绘制方法,对于扩展的时候会有重复代码,如下代码所示,每次扩展要渲染的图形都要拥有openGl和DirectX绘制类和绘制方法,扩展绘制类时要在每一个绘制图形里增加绘制类和对应的绘制方法

public class Cube
{
    public Cube(IRenderEngine re):base(re)
    {
        name = "Cube";
    }
    public string name = "Cube";

    public OpenGL openGL = new OpenGL();
    public DirectX dx = new DirectX();

    public void Draw()
    {
        openGL.Render(name);
    }
    public void DrawDX()
    {
        dx.Render(name);
    }
}
public class Capsule
{
    public Capsule(IRenderEngine re):base(re)
    {
        name = "Capsule";
    }
    public string name = "Capsule";

    public OpenGL openGL = new OpenGL();
    public DirectX dx = new DirectX();

    public void Draw()
    {
        openGL.Render(name);
    }
    public void DrawDX()
    {
        dx.Render(name);
    }
}

因此可以将相似代码可以抽象成父类:

public abstract class IRenderEngine
{
    public abstract void Render(string name);
}
public class IShape
{
    public string name;
    public IRenderEngine renderEngine;

    public IShape(IRenderEngine renderEngine) //初始化形状的同时给绘制类进行赋值
    {
        this.renderEngine = renderEngine;
    }

    public void Draw()
    {
        renderEngine.Render(name);
    }
}

各个子类:

public class Sphere:IShape
{
    public Sphere(IRenderEngine re):base(re)
    {
        name = "Sphere";
    }
}
public class Cube:IShape
{
    public Cube(IRenderEngine re):base(re)
    {
        name = "Cube";
    }
}
public class Capsule:IShape
{
    public Capsule(IRenderEngine re):base(re)
    {
        name = "Capsule";
    }
}
public class OpenGL:IRenderEngine
{
    public override void Render(string name)
    {
        Debug.Log("OpenGL绘制出来了:" + name);
    }
}
public class DirectX:IRenderEngine
{
    public override void Render(string name)
    {
        Debug.Log("DrectX绘制出来了:" + name);
    }
}
public class SuperRender : IRenderEngine
{
    public override void Render(string name)
    {
        Debug.Log("SuperRender绘制出来了:" + name);
    }
} 

之后扩展就不需要在子类更改或者添加代码了,只需继承重写即可

实例:

     不同角色使用多种武器可用桥接模式






猜你喜欢

转载自blog.csdn.net/dengshunhao/article/details/80753662