黑马程序员技术交流社区

标题: 【上海校区】【设计模式】代理模式 [打印本页]

作者: 不二晨    时间: 2018-12-31 10:09
标题: 【上海校区】【设计模式】代理模式
模式定义

代理模式为另一个对象提供一个替身或占位符以控制对这个对象的访问。


一个生动的例子

接口:
public interface Eat {
        void eat();
}

具体实现:
public class EatImpl implements Eat {
        @Override
        public void eat() {
                System.out.println("我要吃饭");
        }
}

代理类:
public class EatProxy implements Eat {
        private Eat eat;

        public EatProxy(Eat eat) {
                this.eat = eat;
        }

        @Override
        public void eat() {
                System.out.println("吃饭前洗手");
                eat.eat();
                System.out.println("吃完后刷碗");
        }
}

测试类:
public class ProxyTest {
        public static void main(String[] args) {
                Eat eat = new EatImpl();
                eat.eat();

                System.out.println();

                EatProxy eatProxy = new EatProxy(eat);
                eatProxy.eat();
        }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
动态代理

Java有自己的代理支持,可以在运行时动态地创建一个代理类,实现一个或多个接口,并将方法的调转发到指定的类,因为实际的代理类是在运行时创建的,所以称为动态代理。

下面是动态代理的类图:


一个生动的例子

InvocationHandler的实现类:
public class DynamicProxyHandler implements InvocationHandler {
        private Eat eat;

        public DynamicProxyHandler(Eat eat) {
                this.eat = eat;
        }

        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Object result = null;
                if (method.getName().equals("eat")) {
                        System.out.println("吃饭前洗手");
                        result = method.invoke(eat, args);
                        System.out.println("吃完后刷碗");
                }
                return result;
        }
}

测试类:
public class DynamicProxyTest {
        public static void main(String[] args) {
                Eat eat = new EatImpl();
                eat.eat();

                System.out.println();

                Eat eatProxy = (Eat) Proxy.newProxyInstance(Eat.class.getClassLoader(), new Class[] { Eat.class },
                                new DynamicProxyHandler(eat));
                eatProxy.eat();
        }
}
---------------------
转载,仅作分享,侵删
作者:EagleLi1
原文:https://blog.csdn.net/qq_21687635/article/details/84993113


作者: 不二晨    时间: 2019-1-3 10:07
奈斯




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2