# write_proxy **Repository Path**: JarryShu/write_proxy ## Basic Information - **Project Name**: write_proxy - **Description**: java动态代理 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-02-24 - **Last Updated**: 2024-02-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 动态代理 ## 什么是代理? 举个例,很多歌星们都会唱歌和写歌,在代码中我们每次需要歌星写歌唱歌,就需要`new`歌星对象,然后才能开始调用他的写歌,唱歌的方法。许嵩,周杰伦,张杰都是不同的类,每次需要不同的歌星都需要按上述方式走一遍,实在是太麻烦了;那么有没有一种方式可以让我们随要随取地去实现指定歌星唱歌写歌的功能呢?那就是代理。把一切调用唱歌写歌工作交给代理来做,我只需告诉代理我想让谁来唱歌写歌就行。 ### 类,接口关系图 ```mermaid graph TB Star(父类Star)---JJ(林俊杰JJ) StarAction(接口StarAction)---JJ Star---Vae(许嵩vae) StarAction---Vae Star---Jay(周杰伦jay) StarAction---Jay StarAction--->proxy(创建代理,star作为代理参数) Star--->proxy(创建代理,star作为代理参数) ``` 如此,我们只需要将需要的对象传给代理,利用代理调用对象的方法。 ```java import com.train.pojos.JJ; import com.train.pojos.Jay; import com.train.pojos.Vae; import com.train.proxy.ProxyUtils; import com.train.pojos.StarAction; public class Main { public static void main(String[] args) { Jay jay = new Jay("周杰伦",31); Vae vae = new Vae("许嵩",23); JJ jj = new JJ("林俊杰",29); // 使用代理 周杰伦 StarAction starProxy = ProxyUtils.createProxy(jay); String res = starProxy.sing("说了再见"); System.out.println(res); res = starProxy.writeSong("说好不哭"); System.out.println(res); // 使用代理 许嵩 starProxy = ProxyUtils.createProxy(vae); res = starProxy.sing("断桥残雪"); System.out.println(res); res = starProxy.writeSong("素颜"); System.out.println(res); // 让代理 许嵩 starProxy = ProxyUtils.createProxy(jj); res = starProxy.sing("不潮不花钱"); System.out.println(res); res = starProxy.writeSong("曹操"); System.out.println(res); } } ``` > tips: > > 利用代理还有一个好处,那就是将我们需要干的工作交给代理完成,而不是交给被代理的对象完成,极大地减少对代码的污染。比如明星只负责开演唱会唱歌,他不用管收钱,收钱这个工作就可以交给代理来做。