橋接模式+遊戲開發中的設計模式——橋接者模式
阿新 • • 發佈:2019-01-14
設計模式總結之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繪製出來了"); } }