PTA DSA 英文題目 7-16 Sort with Swap(0, i)
阿新 • • 發佈:2022-04-22
代理模式是一種注重過程的一種模式,在我們做某一具體事情之前或之後做一些輔助性的工作; 好處是將輔助工作從主要工作中抽離出來,但是又能協同工作, 我們只關心主要業務,對於不關心的事情交給代理來做,實現代理需要兩個物件:被代理者,執行者
JDK中提供的動態代理(只能代理介面):
public interface IBuy { void pay(); } public class Buy implements IBuy{ @Override public void pay() { System.out.println("訂單支付完成!"); } public class PayProxy implements InvocationHandler { private Object obj; public PayProxy(Object target) { this.obj = target; } public Object newInstance() { Class<? extends Object> cls = obj.getClass(); return Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object res = method.invoke(obj, args); System.out.println("----------"); sendMsg(); return res; } private void sendMsg(){ System.out.println("買家已付款,請儘快發貨!"); } } -------------- IBuy buy = (IBuy)new PayProxy(new Buy()).newInstance(); buy.pay(); console: 訂單支付完成! ---------- 買家已付款,請儘快發貨!
CGLIB方式(代理具體類):
public class Buy{ public void pay() { System.out.println("訂單支付完成!"); } } public class CglibPayProxy implements MethodInterceptor { private static final CglibPayProxy PROXY = new CglibPayProxy(); private CglibPayProxy() { } public static CglibPayProxy getInstance() { return PROXY; } @SuppressWarnings("unchecked") public <T> T newProxy(Class<T> clazz) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(clazz); enhancer.setCallback(this); return (T) enhancer.create(); } @Override public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable { Object res = arg3.invokeSuper(arg0, arg2); System.out.println("------------"); sendMsg(); return res; } private void sendMsg() { System.out.println("買家已付款,請儘快發貨!"); } Buy buy = CglibPayProxy.getInstance().newProxy(Buy.class); buy.pay();