> What is the best practice when it comes to writing classes that might > have to know about the user interface. > Wouldn't a class knowing how to draw itself break some best practices > since it depends on what the user interface is (console, GUI, etc)? In this case you can still use MVC/MVVM and inject different UI implementations using common interface: public interface IAgnosticChartDrawing { public void Draw(ChartProperties chartProperties); event EventHandler ChartPanned; } public class GuiChartDrawer : UserControl, IAgnosticChartDrawing { public void Draw(ChartProperties chartProperties) { //GDI, GTK or something else... } //Implement event based on mouse actions } public class ConsoleChartDrawer : IAgnosticChartDrawing { public void Draw(ChartProperties chartProperties) { //'Draw' using characters and symbols... } //Implement event based on keyboard actions } IAgnosticChartDrawing guiView = new GuiChartDrawer(); IAgnosticChartDrawing conView = new ConsoleChartDrawer(); Model model = new FinancialModel(); SampleController controllerGUI = new SampleController(model, guiView); SampleController controllerConsole = new SampleController(model, conView); This way you will be able to re-use your Controller and Model logic while being able to add new types of GUI.