Skip to content

Instantly share code, notes, and snippets.

@dmundt
Created October 31, 2012 21:03
Show Gist options
  • Save dmundt/3989840 to your computer and use it in GitHub Desktop.
Save dmundt/3989840 to your computer and use it in GitHub Desktop.
Dart: Strategy pattern in Dart
// Strategy pattern in Dart with abstract base class.
abstract class Renderer {
static const TEXT = const TextRenderer('text');
static const HTML = const HtmlRenderer('html');
static const JSON = const JsonRenderer('json');
final String name;
const Renderer._internal(this.name);
void render();
}
class TextRenderer extends Renderer {
const TextRenderer(String name) : super._internal(name);
void render() => print('Rendering to $name...');
}
class HtmlRenderer extends Renderer {
const HtmlRenderer(String name) : super._internal(name);
void render() => print('Rendering to $name...');
}
class JsonRenderer extends Renderer {
const JsonRenderer(String name) : super._internal(name);
void render() => print('Rendering to $name...');
}
class Context {
Renderer _renderer;
Context(this._renderer);
export() => _renderer.render();
}
void main() {
var context = new Context(Renderer.JSON);
context.export();
}
// Strategy pattern in Dart with abstract base class and factory constructor.
abstract class Renderer {
final String name;
static Map<String, Renderer> _cache;
factory Renderer(String name) {
if (_cache == null) {
_cache = {};
}
if (_cache.containsKey(name)) {
return _cache[name];
} else {
var renderer;
switch (name) {
case 'text':
renderer = new TextRenderer(name);
break;
case 'html':
renderer = new HtmlRenderer(name);
break;
case 'json':
renderer = new JsonRenderer(name);
break;
default:
throw new ArgumentError('Unknown renderer: $name');
}
_cache[name] = renderer;
return renderer;
}
}
const Renderer._internal(this.name);
void render();
}
class TextRenderer extends Renderer {
TextRenderer(String name) : super._internal(name);
void render() => print('Rendering $name...');
}
class HtmlRenderer extends Renderer {
HtmlRenderer(String name) : super._internal(name);
void render() => print('Rendering $name...');
}
class JsonRenderer extends Renderer {
JsonRenderer(String name) : super._internal(name);
void render() => print('Rendering $name...');
}
class Context {
Renderer _renderer;
Context(this._renderer);
export() => _renderer.render();
}
void main() {
var context = new Context(new Renderer('json'));
context.export();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment