目前我正在 Android 中使用 OpenGLES 2.0,我正在努力开发一种灵活的编程架构来动态处理不同的着色器和不同的对象。
例如,我有两个类:SimpleShader 和 ImageShader。
要绘制一个SimpleShader,它需要指定一个顶点数组:
SimpleShader s = new SimpleShader;
s.draw(final FloatBuffer pFloatBuffer);
同样,对于ImageShader,它需要一组点和一个纹理来绘制:
ImageShader i = new ImageShader;
i.draw(final FloatBuffer pFloatBuffer, final Texture pTexture);
我的问题是这样的; SimpleShader 和ImageShader 都是Shader 的类型。我正在寻找某种允许我使用抽象 draw()
方法的设计模式。谁能提出任何建议?我想这与继承 Shader 特定绘图接口(interface)的对象有关?
最佳答案
首先,您需要一个包装类作为参数。如:
public class ShaderParameter{
public FloatBuffer PFloatBuffer;
}
如果需要 PFloatBuffer
(强制),则将其注入(inject)构造函数。
然后您可以再次创建一个用于绘图的基类。如:
public abstract class Shader{
public void Draw(ShaderParameter param);
}
然后你可以继承这些类来满足你的需要:
public class ImageShaderParameter extends ShaderParameter{
public Texture PTexture;
}
public class ImageShaderWrapper extends Shader{
public override void Draw(ShaderParameter param){
ImageShaderParameter parameter = (ImageShaderParameter)param;
ImageShader i = new ImageShader;
i.draw(parameter.PFloatBuffer, parameter.PTexture);
}
}
这可以使用泛型来进一步增强,以避免参数转换和策略模式。但是,该解释太长,适合其他问题。
(代码可能基于C#,因为我的经验更多是C#)
关于java - 是否存在结构不同但做类似事情的方法的设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21224152/