- 理论基础:http://blog.csdn.net/cooldragon/article/details/52173915
UML类图:
原型实现:
当多种图形使用不同图形程序接口来进行绘制时,比如有球形/正方体/胶囊体等等,使用openGl和DirectX来进行绘制,如果每个要绘制的图形都拥有绘制类和绘制方法,对于扩展的时候会有重复代码,如下代码所示,每次扩展要渲染的图形都要拥有openGl和DirectX绘制类和绘制方法,扩展绘制类时要在每一个绘制图形里增加绘制类和对应的绘制方法
public class Cube
{
public Cube(IRenderEngine re):base(re)
{
name = "Cube";
}
public string name = "Cube";
public OpenGL openGL = new OpenGL();
public DirectX dx = new DirectX();
public void Draw()
{
openGL.Render(name);
}
public void DrawDX()
{
dx.Render(name);
}
}
public class Capsule
{
public Capsule(IRenderEngine re):base(re)
{
name = "Capsule";
}
public string name = "Capsule";
public OpenGL openGL = new OpenGL();
public DirectX dx = new DirectX();
public void Draw()
{
openGL.Render(name);
}
public void DrawDX()
{
dx.Render(name);
}
}
因此可以将相似代码可以抽象成父类:
public abstract class IRenderEngine
{
public abstract void Render(string name);
}
public class IShape
{
public string name;
public IRenderEngine renderEngine;
public IShape(IRenderEngine renderEngine) //初始化形状的同时给绘制类进行赋值
{
this.renderEngine = renderEngine;
}
public void Draw()
{
renderEngine.Render(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 Render(string name)
{
Debug.Log("OpenGL绘制出来了:" + name);
}
}
public class DirectX:IRenderEngine
{
public override void Render(string name)
{
Debug.Log("DrectX绘制出来了:" + name);
}
}
public class SuperRender : IRenderEngine
{
public override void Render(string name)
{
Debug.Log("SuperRender绘制出来了:" + name);
}
}
之后扩展就不需要在子类更改或者添加代码了,只需继承重写即可