You don't need any sort of "end" method any more, the RenderSystem has all the draw calls requested as a big list of these RenderObject and all the logic to make sure they ordered and sequenced properly along with their appropriate API state changes is in there, in one place.
I think things are starting to click, but I do not understand this. How do I not have a end call for my batcher? or should I say what is its replacment?
Let assume my systems generate / fill a struct that describes a render command (information about a batch of sprites or a emitter's particles) just like the one you have mentioned above. And that the RenderSystem is the only thing responsible for carrying out the commands required by the GPU. For the particle emitter this is simple, everything is formulated in one call. But for the sprite batcher everything is formulated over several calls. A batch only finished when the End call or when the current buffer is full, where a new buffer is filled / a new batch is started.
How could the RenderSystem know that a batch of sprites is officially done? This is more in regards to the "final" batch. Not one that is flagged as complete by a "buffer is full" or "texture change" trigger