设计模式之桥接模式

定义:
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
下面用一个实例来说明下这个模式,例如。我们要绘制三个图形,球,正方体和胶囊体,我们用可以使用以下三个渲染引擎来渲染,OpenGL和DirectX以及SuperRender来渲染这三个图形,那么如何来设计这个程序可以使后期增加引擎或者图像的时候更加简单并且不修改而是扩展代码。下面就来看看下面的UML图,我们可以在三个图形和三个引擎上分别提取出来一个父类IShape和IRenderEngine,针对接口开发。


image.png

下面是代码的简单实现:

using UnityEngine;

public class DMBridge:MonoBehaviour
{
    private void Start()
    {
        IRenderEngine renderEngine = new DirectX();

        Sphere sphere = new Sphere(renderEngine);
        sphere.Draw();
        Cube cube = new Cube(renderEngine);
        cube.Draw();
        Capsule capsule = new Capsule(renderEngine);
        capsule.Draw();
    }
}
public class IShape
{
    public string Name;
    public IRenderEngine renderEngine;
    public IShape(IRenderEngine renderEngine)
    {
        this.renderEngine = renderEngine;
    }
    
    public  void Draw()
    {
        renderEngine.Draw(Name);
    }
}
//渲染引擎公共基类
public abstract class IRenderEngine
{
    public abstract void Draw(string 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 Draw(string name)
    {
        Debug.Log("OpenGL绘制出来了:"+name);
    }
}
public class DirectX: IRenderEngine
{
    public override void Draw(string name)
    {
        Debug.Log("DirectX绘制出来了:" + name);
    }
}

将脚本挂在Camera上运行可以看到输出
image.png

如果这时候如果我想要更换渲染引擎的话就直接将Start方法里面的IRenderEngine修改成如下就OK

IRenderEngine renderEngine = new OpenGl();

image.png

这样以后修改或者增加功能就会变的非常的简单
桥接模式参考
http://blog.csdn.net/cooldragon/article/details/52173915

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容