(学习笔记)设计模式之桥接模式

本文通过一个具体的绘图实例,详细介绍了桥接模式的应用场景及其实现方式。通过将抽象与实现进行分离,使得两者能够独立变化,从而简化了系统的扩展与维护。

桥接模式可以应用于不同的不同种类事物之间相互联系的条件下。比如不同的角色可以使用不同的武器,此时就可以使用桥接模式。

例如:

有几种图形cube,Cpasule需要绘制,此时有个绘制工具OpenGL;

通用方法为:

绘制工具:

public class OpenGL//绘制引擎1号
{
    public void Render(string name)
    {
        Debug.Log("OpenGL绘制出来了" + name);
    }
}
public class DirecetX//绘制引擎2号
{
    public void Render(string name)
    {
        Debug.Log("DirectX绘制出来了" + name);
    }
}
图形类
   public class Sphere//球
    {
        public string name = "Sphere";
        public OpenGL openGL = new OpenGL();//为了让球有自我绘制的功能
    public DirecetX direcetX = new DirecetX();//绘制引擎2号
    public void DrawDX()//
    {
        direcetX.Render(name);
    }
        public void Draw()
        {
            openGL.Render(name);
        }
    }
    public class Cube//球
    {
        public string name = "Cube";
        public OpenGL openGL = new OpenGL();//为了让球有自我绘制的功能
    public DirecetX direcetX = new DirecetX();//绘制引擎2号
    public void DrawDX()//
    {
        direcetX.Render(name);
    }
    public void Draw()
        {
            openGL.Render(name);
        }
    }
    public class Capsule//胶囊体
    {
        public string name = "Capsule";
        public OpenGL openGL = new OpenGL();//为了让球有自我绘制的功能
    public DirecetX direcetX = new DirecetX();//绘制引擎2号
    public void DrawDX()//
    {
        direcetX.Render(name);
    }
    public void Draw()
        {
            openGL.Render(name);
        }
    }
客户端调用:
  private void Start()
    {
        Sphere sphere = new Sphere();
        sphere.Draw();
        Cube cube = new Cube();
        cube.Draw();
        Capsule capsule = new Capsule();
        capsule.Draw();
    }

此时在客户端调用不同的引擎绘制图形的时候就需要调用图形里面不同的绘制方法,如果再增加一个引擎,又要修改很多代码,所以很麻烦。

图形类和引擎类里面都有很多相似的代码,可以提取出来的。

因此可以声明两个类保存重复代码

public class IShape//图形类
{
    public string name;
    public RenderEngine renderEngine;//引擎
    public void Draw()
    {
        renderEngine.draw(name);
    }
    public IShape(RenderEngine renderEngine)
    {
        this.renderEngine = renderEngine;
    }
}
public abstract class RenderEngine//引擎类
{
    public abstract void draw(string name);
}
图形类,引擎类只需要继承就好了

 public class Sphere:IShape//球
    {
    public Sphere(RenderEngine re) : base(re)
    {
        name = "Sphere";
    }
    }
    public class Cube:IShape//球
    {
        public Cube(RenderEngine re):base(re)
    {
        name = "Cube";
    }
    }
    public class Capsule:IShape//胶囊体
    {
    public Capsule(RenderEngine re):base(re)
    {
        name = "Cube";
    }
    }
public class OpenGL:RenderEngine//绘制引擎1号
{
    public override void draw(string name)
    {
        Debug.Log("OpenGL绘制出来了" + name);
    }
}
public class DirecetX:RenderEngine//绘制引擎2号
{
    public override void draw(string name)
    {
        Debug.Log("DirectX绘制出来了" + name);
    }
}
客户端调用

    private void Start()
    {
        RenderEngine renderEngine = new OpenGL();
        IShape sphere = new Sphere(renderEngine);
        sphere.Draw();
    }
如果再添加图形,或者引擎等操作就很简单了。这就是桥接模式。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zero游戏开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值