Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import org.springframework.cglib.proxy.Enhancer
- import org.springframework.cglib.proxy.MethodInterceptor
- import org.springframework.cglib.proxy.MethodProxy
- import java.lang.reflect.Method
- class Data {
- Integer a = 0
- Integer b = 0
- Integer c = 0
- @Override
- public String toString() {
- return "Data{" +
- "a=" + a +
- ", b=" + b +
- ", c=" + c +
- '}';
- }
- }
- @FunctionalInterface
- interface Subscriber {
- void receiveMessage(String type, Data data)
- }
- class Observable {
- Map<String, List<Subscriber>> subscribers = new HashMap<>()
- def notifyAll(String type, Data data) {
- subscribers.get('ANY').each { it.receiveMessage(type, data) }
- subscribers.get(type).each { it.receiveMessage(type, data) }
- }
- def subscribe(String type, Subscriber subscriber) {
- subscribers.putIfAbsent(type, new ArrayList<>())
- subscribers.get(type).add(subscriber)
- }
- def subscribe(List<String> types, Subscriber subscriber) {
- types.each { type ->
- subscribers.putIfAbsent(type, new ArrayList<>())
- subscribers.get(type).add(subscriber)
- }
- }
- }
- def observable = new Observable()
- def enhancer = new Enhancer()
- enhancer.setSuperclass(Data)
- MethodInterceptor interceptor = { Object object, Method method, Object[] args, MethodProxy proxy ->
- if (method.getName().startsWith('set') && method.getName() != 'setProperty') {
- // println method.getName()
- // println args
- // println ''
- observable.notifyAll('SET_' + method.getName().substring(3), object as Data)
- return proxy.invokeSuper(object, args)
- } else {
- return proxy.invokeSuper(object, args)
- }
- } as MethodInterceptor
- enhancer.setCallback(interceptor)
- observable.subscribe('ANY') { type, data -> println "$type" }
- observable.subscribe(['SET_A', 'SET_B']) { type, data -> data.c = data.a + data.b }
- Data data = (Data) enhancer.create()
- data.a = 12
- data.setB(10)
- data
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement