桥接模式+游戏开发中的设计模式——桥接者模式

设计模式总结之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绘制出来了");
    }

}

猜你喜欢

转载自blog.csdn.net/qq_35422344/article/details/86362248