Skip to content

Commit 5ca2411

Browse files
committed
add proxy example
1 parent 80c348f commit 5ca2411

File tree

6 files changed

+200
-1
lines changed

6 files changed

+200
-1
lines changed

README.md

Lines changed: 84 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,93 @@
55

66

77
## 代理模式
8-
包装一个对象,来控制对它的访问
8+
包装一个对象,来控制对它的访问(重点学习动态代理涉及反射知识) [源码例子](src/proxy)
99

1010
![代理模式](img/design_pattern_proxy.png)
1111

12+
定义一个接口
13+
14+
```java
15+
public interface IProgrammer {
16+
void developeApp();
17+
void developeWebSite();
18+
void developeServer();
19+
}
20+
```
21+
22+
真实的对象实现接口的方法
23+
24+
```java
25+
public class RealSubject implements IProgrammer {
26+
27+
@Override
28+
public void developeApp() {
29+
System.out.println("客户需要开发一个包含Android客户端、iPhone客户端的APP");
30+
31+
}
32+
33+
@Override
34+
public void developeWebSite() {
35+
System.out.println("客户需要开发一个PC端网站");
36+
37+
}
38+
39+
@Override
40+
public void developeServer() {
41+
System.out.println("客户需要开发一个服务于APP和PC网站的后台");
42+
43+
}
44+
45+
}
46+
47+
```
48+
49+
假的对象调用真实对象的方法
50+
51+
```java
52+
public class ProgramTestDrive {
53+
54+
/**
55+
* @param args
56+
*/
57+
public static void main(String[] args) {
58+
//被代理类
59+
RealSubject realSubject = new RealSubject();
60+
61+
Class<?> clazz = realSubject.getClass();
62+
ClassLoader loader = clazz.getClassLoader();
63+
64+
OwerInvocationHandler handler = new OwerInvocationHandler(realSubject);
65+
IProgrammer iProgrammer = new ProxySubject().getOwerProxy(loader,
66+
new Class[] { IProgrammer.class }, handler);
67+
68+
iProgrammer.developeApp();
69+
iProgrammer.developeWebSite();
70+
iProgrammer.developeWebSite();
71+
}
72+
73+
}
74+
```
75+
76+
```java
77+
public class ProxySubject {
78+
79+
/**
80+
* 返回一个代理类
81+
* @param loader
82+
* @param clazz
83+
* @param handler
84+
* @return
85+
*/
86+
public IProgrammer getOwerProxy(ClassLoader loader, Class<?> clazz[],
87+
InvocationHandler handler) {
88+
return (IProgrammer) Proxy.newProxyInstance(loader, clazz, handler);
89+
}
90+
}
91+
```
92+
93+
`Proxy`属于`java.lang.reflect`反射包下的类,传入一个真实对象的ClassLoader,真实对象实现的接口和`java.lang.reflect`包下InvocationHandler的一个子类,得到一个代理的对象,代理对象实现真实对象一样的接口,所以可以调用真实对象实现的接口方法
94+
1295

1396
## 外观模式
1497
包装多个对象,以简化它们的接口 [源码例子](src/facade)

src/proxy/IProgrammer.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package proxy;
2+
3+
/**
4+
* Created by http://teachcourse.cn on 2018-3-30.
5+
*/
6+
public interface IProgrammer {
7+
void developeApp();
8+
void developeWebSite();
9+
void developeServer();
10+
}

src/proxy/OwerInvocationHandler.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package proxy;
2+
3+
import java.lang.reflect.InvocationHandler;
4+
import java.lang.reflect.Method;
5+
6+
/**
7+
* Created by http://teachcourse.cn on 2018-3-30.
8+
*/
9+
public class OwerInvocationHandler implements InvocationHandler {
10+
private IProgrammer programmer;
11+
12+
13+
public OwerInvocationHandler(IProgrammer programmer) {
14+
this.programmer = programmer;
15+
}
16+
17+
18+
@Override
19+
public Object invoke(Object arg0, Method arg1, Object[] arg2)
20+
throws Throwable {
21+
//programmer是智行arg1方法的对象,返回该对象
22+
return arg1.invoke(programmer, arg2);
23+
}
24+
}

src/proxy/ProgramTestDrive.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package proxy;
2+
3+
import proxy.impl.ProxySubject;
4+
import proxy.impl.RealSubject;
5+
6+
/**
7+
* Created by http://teachcourse.cn on 2018-3-30.
8+
*/
9+
public class ProgramTestDrive {
10+
11+
/**
12+
* @param args
13+
*/
14+
public static void main(String[] args) {
15+
//±»´úÀíÀà
16+
RealSubject realSubject = new RealSubject();
17+
18+
Class<?> clazz = realSubject.getClass();
19+
ClassLoader loader = clazz.getClassLoader();
20+
21+
OwerInvocationHandler handler = new OwerInvocationHandler(realSubject);
22+
IProgrammer iProgrammer = new ProxySubject().getOwerProxy(loader,
23+
new Class[] { IProgrammer.class }, handler);
24+
25+
iProgrammer.developeApp();
26+
iProgrammer.developeWebSite();
27+
iProgrammer.developeWebSite();
28+
}
29+
30+
}

src/proxy/impl/ProxySubject.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package proxy.impl;
2+
3+
import java.lang.reflect.InvocationHandler;
4+
import java.lang.reflect.Proxy;
5+
6+
import proxy.IProgrammer;
7+
8+
/**
9+
* Created by http://teachcourse.cn on 2018-3-30.
10+
*/
11+
public class ProxySubject {
12+
13+
/**
14+
* ·µ»ØÒ»¸ö´úÀíÀà
15+
* @param loader
16+
* @param clazz
17+
* @param handler
18+
* @return
19+
*/
20+
public IProgrammer getOwerProxy(ClassLoader loader, Class<?> clazz[],
21+
InvocationHandler handler) {
22+
return (IProgrammer) Proxy.newProxyInstance(loader, clazz, handler);
23+
}
24+
}

src/proxy/impl/RealSubject.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package proxy.impl;
2+
3+
import proxy.IProgrammer;
4+
5+
/**
6+
* Created by http://teachcourse.cn on 2018-3-30.
7+
*/
8+
public class RealSubject implements IProgrammer {
9+
10+
@Override
11+
public void developeApp() {
12+
System.out.println("客户需要开发一个包含Android客户端、iPhone客户端的APP");
13+
14+
}
15+
16+
@Override
17+
public void developeWebSite() {
18+
System.out.println("客户需要开发一个PC端网站");
19+
20+
}
21+
22+
@Override
23+
public void developeServer() {
24+
System.out.println("客户需要开发一个服务于APP和PC网站的后台");
25+
26+
}
27+
28+
}

0 commit comments

Comments
 (0)