package example.com.lookweather.test;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * Created by 黑月 on 2017/3/7.
 */

public class TestPattern {
    public static void main(String[] args) {
        proxy();

    }

    /**
     * 代理模式
     * newProxyInstance 返回接口 调用接口实现类的任何方法都会调用代理模式的invoke
     */
    private static void proxy() {
        final ICat cat = new Cat();

        ICat proxyCat=(ICat) Proxy.newProxyInstance(TestPattern.class.getClassLoader(), cat.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
                if (method.getName().equals("run")) {
                    System.out.println("猫抓老鼠");
                    return method.invoke(cat, objects);
                }
                return method.invoke(cat, objects);
            }
        });
        proxyCat.hashCode();
    }

    /**
     * 装饰者模式
     * 1.装饰者和被装饰者实现或继承相同的接口或类
     * 2.装饰者持有被装饰者的引用
     *
     */

    static class Decorate implements ICat{

        ICat mICat;

        public Decorate(ICat ICat) {
            this.mICat = ICat;
        }

        @Override
        public void run() {
            System.out.println("猫抓老鼠");
            mICat.run();
        }
    }

    static class Cat implements ICat{

        @Override
        public void run() {
            System.out.println("猫抓到了老鼠...");
        }
    }
    interface ICat{
        void run();
    }

}