Skip to content

Instantly share code, notes, and snippets.

@thonglinhma
Last active March 10, 2019 09:40
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save thonglinhma/7985f6805ff5895f1b26e72f4b0d46f7 to your computer and use it in GitHub Desktop.
Save thonglinhma/7985f6805ff5895f1b26e72f4b0d46f7 to your computer and use it in GitHub Desktop.
abstract class PlanetVisitor {
void visit({Planet planet});
}
abstract class Planet {
void accept({PlanetVisitor visitor});
}
class MoonJedah extends Planet {
@override
void accept({PlanetVisitor visitor}) => visitor.visit(planet: this);
}
class PlanetAlderaan extends Planet {
@override
void accept({PlanetVisitor visitor}) => visitor.visit(planet: this);
}
class PlanetCoruscant extends Planet {
@override
void accept({PlanetVisitor visitor}) => visitor.visit(planet: this);
}
class PlanetTatooine extends Planet {
@override
void accept({PlanetVisitor visitor}) => visitor.visit(planet: this);
}
class NameVisitor extends PlanetVisitor {
String name = "";
NameVisitor([this.name]);
@override
void visit({Planet planet}) {
if (planet is PlanetAlderaan) {
name = "Alderaan";
} else if (planet is PlanetCoruscant) {
name = "Coruscant";
} else if (planet is PlanetTatooine) {
name = "Tatooine";
} else if (planet is MoonJedah) {
name = "Jedah";
}
}
}
main(List<String> arguments) {
final planets = <Planet>[new PlanetAlderaan(), new PlanetCoruscant(), new PlanetTatooine(), new MoonJedah()];
final names = planets.map<String>((planet) {
final visitor = new NameVisitor();
planet.accept(visitor: visitor);
return visitor.name;
});
names.forEach((name) => print(name));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment