1. 代理模式主要有两种:静态代理和动态代理
2. 静态代理:
比如要在输出“HelloWorld”前打印一个字符串“Welcome”
A:先定义一个接口类
- package ttitfly.proxy;
-
- public interface HelloWorld {
- public void print();
-
- }
-
B: 定义一个该接口的实现类
- package ttitfly.proxy;
-
- public class HelloWorldImpl implements HelloWorld{
-
- public void print(){
- System.out.println("HelloWorld");
- }
-
-
-
- }
C:定义一个静态代理类
- package ttitfly.proxy;
-
- public class StaticProxy implements HelloWorld{
-
- public HelloWorld helloWorld ;
- public StaticProxy(HelloWorld helloWorld){
- this.helloWorld = helloWorld;
- }
-
- public void print(){
- System.out.println("Welcome");
-
- helloWorld.print();
- }
-
-
-
-
-
- }
D: 一个测试类:
- package ttitfly.proxy;
-
- public class TestStaticProxy {
-
- public static void main(String[] args){
- HelloWorld helloWorld = new HelloWorldImpl();
- StaticProxy staticProxy = new StaticProxy(helloWorld);
- staticProxy.print();
-
-
- }
- }
可以看出静态代理类有一个很不爽的缺点:当如果接口加一个方法(把上面所有的代码的注释给去掉),所有的实现类和代理类里都需要做个实现。这就增加了代码的复杂度。动态代理就可以避免这个缺点。
静态代理的问题:
1. 一个真实角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀;
2. 当如果接口加一个方法(比如上面的say),所有的实现类和代理类里都需要做个实现。这就增加了代码的复杂度;
3.如果事先并不知道真实角色,该如何使用代理呢?
采用动态解决以上问题。
3 。动态代理
动态代理与普通的代理相比较,最大的好处是接口中声明的所有方法都被转移到一个集中的方法中处理(invoke),这样,在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。
动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。该invoke方法就是调用被代理接口的所有方法时需要调用的,该invoke方法返回的值是被代理接口的一个实现类
代理类:
- package ttitfly.proxy;
-
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- import java.lang.reflect.Proxy;
-
- public class DynamicProxy implements InvocationHandler{
-
- private Object object;
-
-
- public Object bindRelation(Object object){
- this.object = object;
- return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),this);
- }
-
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- System.out.println("Welcome");
- Object result = method.invoke(object, args);
- return result;
- }
-
- }
测试类:
- package ttitfly.proxy;
-
- public class TestDynamicProxy {
- public static void main(String[] args){
- HelloWorld helloWorld = new HelloWorldImpl();
- DynamicProxy dp = new DynamicProxy();
-
- HelloWorld helloWorld1 = (HelloWorld)dp.bindRelation(helloWorld);
- helloWorld1.print();
- helloWorld1.say();
-
-
- HelloWorld helloWorld2 = new HelloWorldImpl();
- helloWorld2.print();
- helloWorld2.say();
-
- }
- }
分享到:
相关推荐
Java中的代理模式--静态代理和动态代理 Java中的代理模式--静态代理和动态代理
动态代理的代码例子 里面敲好了注释 搭配文章观看更好
- 静态代理与动态代理 - 常见的动态代理实现 - JDK Proxy - CGLIB - JDK Proxy 和 CGLIB 的对比 - 动态代理的实际应用 - Spring AOP 说在前面:今天我们来聊一聊 Java 中的代理,先来聊聊故事背景: 小明想...
Java设计模式——代理设计模式(静态代理和动态代理) 各种情况例子源码
自己编写的代理设计模式,示例中的代码绝对没有使用伪代码,是开发的项目真实案例,简单易懂
Java各种代理模式以及AOP的实现代码 : 1.AspectJ - 静态代理 2. 动态代理 (1)JDK动态代理 (2)CGlib代理
Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理)
设计模式之代理模式_静态代理的一个java实现的demo。主类在Client中。仅代码实现,可供初学者参考使用
java 代理模式实现代码及设计详解:动态代理模式、静态代理模式
│ 北京动力节点SSH前言-007-代理模式-静态代理与动态代理.mp4 │ 北京动力节点SSH前言-008-代理模式-静态代理测试环境的搭建.mp4 │ 北京动力节点SSH前言-009-代理模式-解决快捷键冲突问题.mp4 │ 北京动力节点SSH...
Java编程模式-代理模式。介绍了静态代理模式和动态代理模式
NULL 博文链接:https://871656094.iteye.com/blog/2355335
此资源为文章中《代理设计模式:静态代理和动态代理的理解、实现与区别(优缺点)》与《 AOP动态代理声明式的3种配置方式过程与区别》的案例代码,可下载参考学习。
在了解动态代理前,我们需要先了解一下什么是代理模式。 代理模式 代理模式(Proxy Pattern)是 23 种设计模式的一种,属于结构型模式。他指的是一个对象本身不做实际的操作,而是通过其他对象来得到自己想要的结果...
Java代理模式模板代码,包含动态代理与静态代理。 静态代理使用了传统的代理类来代理,动态代理中使用了jdk的反射原理进行代理
这里提供了静态代理和动态代理的入门写法~一看即懂!
Java 代理模式: 详见:http://blog.csdn.net/q610098308/article/details/74144046
NULL 博文链接:https://skyuck.iteye.com/blog/524561
包含静态代理和动态代理demo代码