Created
October 31, 2012 21:03
-
-
Save dmundt/3989840 to your computer and use it in GitHub Desktop.
Dart: Strategy pattern in Dart
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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(); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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