設計模式之橋接模式

定義:
將抽象部分與它的實現部分分離,使它們都可以獨立地變化。
下面用一個實例來說明下這個模式,例如。我們要繪制三個圖形,球,正方體和膠囊體,我們用可以使用以下三個渲染引擎來渲染,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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容