Skip to content

Instantly share code, notes, and snippets.

@tvd12
Last active April 5, 2023 09:12
Show Gist options
  • Select an option

  • Save tvd12/569441f8f858ab08b54235434040ea62 to your computer and use it in GitHub Desktop.

Select an option

Save tvd12/569441f8f858ab08b54235434040ea62 to your computer and use it in GitHub Desktop.
Design Patterns
import 'dart:mirrors';
class A {
late String a;
A clone() {
var instance = reflect(this);
var newInstance = reflect(this).type.newInstance(
Symbol.empty,
[]
);
ClassMirror? classMirror = reflectClass(runtimeType);
while (classMirror != null) {
var fields = classMirror.declarations.values.whereType<VariableMirror>();
for (var field in fields) {
newInstance
.setField(
field.simpleName,
instance
.getField(field.simpleName)
.reflectee
)
.reflectee;
}
classMirror = classMirror.superclass;
}
return newInstance.reflectee as A;
}
}
class B extends A {
late String b;
}
class C extends A {
late String c;
@override
String toString() {
return "$a $c";
}
}
void main(List<String> arguments) {
C c = C();
c.a = 'hello';
c.c = 'world';
print(c.clone());
}
class A {
late String a;
}
class B extends A {
late String b;
}
class C extends A {
late String c;
@override
String toString() {
return "$a $c";
}
}
abstract class Copier<T> {
T convert(T t) {
T newT = newInstance();
setProperties(t, newT);
return newT;
}
T newInstance();
void setProperties(T obj, T newObj);
}
class ACopier extends Copier<A> {
@override
A newInstance() {
return A();
}
@override
void setProperties(A obj, A newObj) {
newObj.a = obj.a;
}
}
class BCopier extends ACopier {
@override
A newInstance() {
return B();
}
@override
void setProperties(A obj, A newObj) {
(newObj as B).b = (obj as B).b;
super.setProperties(obj, newObj);
}
}
class CCopier extends ACopier {
@override
A newInstance() {
return C();
}
@override
void setProperties(A obj, A newObj) {
(newObj as C).c = (obj as C).c;
super.setProperties(obj, newObj);
}
}
class Cloner {
Map<Type, Copier> converters = {
A: ACopier(),
B: BCopier(),
C: CCopier()
};
T clone<T>(T value) {
return converters[value.runtimeType]?.convert(value);
}
}
void main(List<String> arguments) {
Cloner cloner = Cloner();
C c = C();
c.a = "hello";
c.c = "world";
print(cloner.clone(c));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment