1. 程式人生 > >橋接模式+遊戲開發中的設計模式——橋接者模式

橋接模式+遊戲開發中的設計模式——橋接者模式

設計模式總結之Bridge Pattern(橋接模式)

https://blog.csdn.net/cooldragon/article/details/52173915

何為橋接模式

橋接模式(Bridge):將抽象部分和他的實現部分分離,使他們都可以獨立工作

例如:角色裝備槍。多種角色A B C,   多種槍1 2 3。

假設A B C使用1;

菜鳥篇:

抽象出一個角色類O,具體的角色繼承它    得到O-A  O-B  O-C;

然後,建立具體多種槍類,讓具體角色使用那把槍,繼承那個槍類  得到A-1 B-1 C-1。

此時若換槍2,則具體的角色都要更改 得到A-2 B-2 C-2;

橋接模式篇

將槍也抽象出來G(抽象出方法Attack()等)     ,具體槍繼承他 得到G-1(override Attack())      G-2(override Attack())      G-3(override Attack())     

然後為了應對換槍,先在角色O中獲取G(抽象方法Attack()等),使用形參 G      構造方法 或者  普通方法

最後使用多型   物件的宣告必須為父類;例項化的物件是子類   從而O獲取到G被重寫過的方法override Attack(),則所有的A B C獲得override Attack(),從而完成了更換槍的操作。

案例:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class DN02Bridge : MonoBehaviour {
    void Start() {
        IRenderEngine iRenderEngine = new OpenGL();//多型
        //IRenderEngine iRenderEngine = new Dirext();//更換槍

        Sphere sphere = new Sphere(iRenderEngine);
        sphere.Draw();

        Cube cube = new Cube(iRenderEngine);
        cube.Draw();
    }
	
}
//抽象-角色-O
public class Ishape{
    public string name;
    public IRenderEngine renderEngine;//獲取抽象槍01

    public Ishape(IRenderEngine irenderEngine)//獲取抽象槍02   構造方法
    {
        this.renderEngine = irenderEngine;
    }

    public void Draw() {
        renderEngine.Render(name);
    }
}
//抽象-槍-G
public abstract class IRenderEngine {
    public abstract void Render(string name);//攻擊方法
}




//具體角色A
public class Sphere:Ishape {
    public Sphere(IRenderEngine re) :base(re)
    {
        name = "Sphere";
    }
    //public string name = "Sphere";

    //public OpenGL openGL = new OpenGL();
    //public Dirext dirext = new Dirext();
    //public void Draw() {
    //    openGL.Render(name);
    //}
}
//具體角色B
public class Cube:Ishape {
    public Cube(IRenderEngine re): base(re)
    {
        name = "Cube";
    }
    //public string name = "Cube";

    //public OpenGL openGL = new OpenGL();
    //public Dirext dirext = new Dirext();
    //public void Draw() {
    //    openGL.Render(name);
    //}
}
//具體槍1
public class OpenGL:IRenderEngine 
{ 
    public override void Render(string name )//重寫攻擊方法
    {
        Debug.Log("OpenGL繪製出來了");   
    }
    
}
//具體槍2
public class Dirext:IRenderEngine
{
    public override void Render(string name)
    {
        Debug.Log("Dirext繪製出來了");
    }

}