@Илиян
Проблема ми е че след като Canvas#render_as(renderer), получи аргумент, ще трябва да знае за неговите методи.
Не е нужно да знае особено много, както се вижда от моето решение на този проблем.
Вместо Canvas#render_as, които да приема като аргумет обект от тип Renderers, мисля че е по-добре в Renderers да има метод, който да взима като аргумент обект от тип Canvas, за да го рендерира. Така Renderers и ще е плъгин, защото Canvas няма да знае за него.
Принципно, тази идея не е лоша. Въпросът е, че в момента интерфейсът (и условието) на трета задача са фиксирани и са това, което са. Трябва да направим най-доброто решение, на което сме способни, при така дадените ограничения. Нямаме право да променяме интерфейсните спецификации.
Предполагам, че ако се подава обект от Canvas ще е нужно предварително да се фиксира вътрешната структура на представяне.
С това не съм съгласен. Рендерерите биха могли да използват спокойно вече дефинирания публичен интерфейс на Canvas, както аз го правя в моето решение. Както се вижда, Ако го нямаше методът Canvas#render_as, моето решение е почти същото като това, което ти си представяш – паното знае много малко, даже почти нищо за рендерерите. Самите рендерери могат да се приемат и като "плъгини", както ти ги наричаш.