周六无事,看看java的代理模式
静态代理:
代理模式,抽象的说就是代理者能提供被代理者的某种服务,并对其服务进行一定的封装,并提供自己的一些特殊服务,即完成对象的功能代理
举例说明,例如租房就是一种公共服务,房东就是提供这种服务的具体实例,中介公司就是这种服务的代理,并在房东和房客之间提供一系列的其他服务
代理列举:
Rent.java(租房服务),静态代理可以是接口也可以是抽象类,此处使用接口
package com.lyncc.proxy; public interface Rent { public boolean rent(int money); }
Landlord.java(租房的具体实例,例如xxx房东,实现租房服务)
package com.lyncc.proxy; public class Landlord implements Rent{ @Override public boolean rent(int money) { if(money>4000){ System.out.println("给你一个适合居住的房子"); return true; }else{ System.out.println("钱有些少,要不再加一点?"); return false; } } }
Agency.java(租房中介,提供一个租房平台,并收取一定的费用,boolean fee 代表房客是否愿意交中介费)
静态代理的核心就是要把具体的代理实例传递进来,这里具体指的是landlord,就是房东,简单的说,如果没有房东委托中介公司,中介公司无法代理租房服务
package com.lyncc.proxy; public class Agency implements Rent { private boolean fee; public Agency(boolean fee){ this.fee = fee; } public Landlord landlord; @Override public boolean rent(int money) { if(fee){ System.out.println("愿意交中介费的孩子是好孩子"); if(null == landlord){ landlord = new Landlord(); } return landlord.rent(money); }else{ System.out.println("不交中介费,无房可租"); return false; } } }
客户测试端
package com.lyncc.proxy; import org.junit.Test; public class Client { @Test public void test(){ Agency agency = new Agency(true); agency.rent(5000); } @Test public void test1(){ Agency agency = new Agency(true); agency.rent(3000); } @Test public void test2(){ Agency agency = new Agency(false); agency.rent(3000); } }
动态代理,代码中有注释,希望大家一起学习,错了的地方指出
动态代理的原因就是静态代理的缺陷,一个具体实例,如果需要代理就有唯一的代理类为其代理
代码量增加了2倍,大规模编程不方便
代码模型实例就是淘宝代理了旅游店,零食店,提供了旅游,和买零食的服务
Travel.java(旅游服务)
package com.lyncc.dynamic.proxy; /** * 旅游就是一种服务,具体实现就是各个旅行社,或者各个地方的旅游 * 对于动态代理对象,不用管是哪个旅行社或者哪个地方的旅游,它只负责提供服务 * @author BazingaLyn * */ public interface Travel { public void travel(int money); }
Snack.java(买零食的服务)
package com.lyncc.dynamic.proxy; /** * 购买零食也是一种服务消费,例如淘宝有很多的零食店,例如有xiaoy零食店 * 桥林零食店,三只松鼠等等,当你进入淘宝的哪个零食页面,默认就是哪个零食店实例 * 淘宝这种代理只会返回购买的服务,否则就会出现实例化N个对象 * 例如,买家进入桥林零食店 * 后台就要new Qiaolinshop() * 进入09机械键盘店 * 后台就要new 09keyBoardshop() * 淘宝后面的卖家数以万计,这样做很不现实 * 即淘宝后台只会返回一个接口,动态代理很容易实现这样的设计理念 * @author BazingaLyn * */ public interface Snack { public void buy(int money); }
NanjingTravel.java(旅游的实例,南京旅游)
package com.lyncc.dynamic.proxy; /** * 旅游服务的一个实例 * @author BazingaLyn * */ public class NanjingTravel implements Travel{ @Override public void travel(int money) { if(money > 50000){ System.out.println("南京兔女郎豪华紫金山5日4夜游,你懂得,O(∩_∩)O~"); }else if(money > 20000){ System.out.println("南京江宁瑞都轻奢店美女陪伴一日游"); }else if(money > 5000){ System.out.println("南京夫子庙一日游"); }else{ System.out.println("南京高校基友陪伴一日游"); } } }
QiaolinSnackShop.java(零食店,桥林零食(有看war3的吗?哈哈))
package com.lyncc.dynamic.proxy; /** * 零食店的一个实例 * @author BazingaLyn * */ public class QiaolinSnackShop implements Snack{ @Override public void buy(int money) { if(money > 500){ System.out.println("送桥林签名"); }else if(money > 200){ System.out.println("送四哥光环"); }else if(money > 100){ System.out.println("包邮"); }else{ System.out.println("你不会只买了一包辣条吧?"); } } }
Taobao.java(淘宝商城,代理上述的服务)
package com.lyncc.dynamic.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * 淘宝实现动态代理,implement InvocationHandler * Object 代理具体哪个实例 * fee 是否愿意用支付宝付钱,不愿意不提供服务 * @author BazingaLyn * */ public class Taobao implements InvocationHandler{ public Object obj; public boolean fee; public Taobao(Object obj, boolean fee){ this.obj = obj; this.fee = fee; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //代理商自定义的一些要求 if(fee){ System.out.println("谢谢你先把钱打到支付宝"); method.invoke(obj, args); }else{ System.out.println("支付宝不愿意打,那你自己去找服务商吧"); } return null; } }
Client.java(买家)
package com.lyncc.dynamic.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; import org.junit.Test; /** * 买家测试 * @author BazingaLyn * */ public class Client { /** * 买家需要旅游服务 */ @Test public void test1(){ //进入南京旅游的页面,实例化南京旅游 NanjingTravel nanjingTravel = new NanjingTravel(); //淘宝代理了南京旅游 InvocationHandler handler = new Taobao(nanjingTravel,true); Class<?> clz = handler.getClass(); //返回了旅游的服务,这很重要,如果返回的是NanjingTravel就很累了,这样就没有意义了 //Proxy.newProxyInstance代理的关键 Travel travel = (Travel)Proxy.newProxyInstance(clz.getClassLoader(), nanjingTravel.getClass() .getInterfaces(), handler); //交钱旅游 travel.travel(1000000); } @Test public void test2(){ NanjingTravel nanjingTravel = new NanjingTravel(); InvocationHandler handler = new Taobao(nanjingTravel,false); Class<?> clz = handler.getClass(); Travel travel = (Travel)Proxy.newProxyInstance(clz.getClassLoader(), nanjingTravel.getClass() .getInterfaces(), handler); travel.travel(1000000); } @Test public void test3(){ QiaolinSnackShop qiaolinSnackShop = new QiaolinSnackShop(); InvocationHandler handler = new Taobao(qiaolinSnackShop,true); Class<?> clz = handler.getClass(); Snack snack = (Snack)Proxy.newProxyInstance(clz.getClassLoader(), qiaolinSnackShop.getClass() .getInterfaces(), handler); snack.buy(1000000); } }
关于具体的java方式,可以查看jdk的api有具体说明,我也是查看和百度的,认识浅薄,求大神科普
相关推荐
【初识Java】是学习Java编程语言的基础阶段,这一阶段主要涵盖了Java的核心概念和技术。以下是对标题和描述中涉及知识点的详细解释: 1. **JavaEE**:全称为Java Enterprise Edition,是Java平台的一个版本,专门...
Java程序设计--初识java 28.pdf
初识Firebug全文--Firebug的使用.mht初识Firebug全文--Firebug的使用.mht初识Firebug全文--Firebug的使用.mht初识Firebug全文--Firebug的使用.mht初识Firebug全文--Firebug的使用.mht初识Firebug全文--Firebug的使用...
Java 语言以其“一次编译,到处运行”的特性在编程界占据着重要地位。这是因为Java程序首先被编译成与平台无关的字节码(.class文件),这些字节码随后在任何支持Java的平台上由Java虚拟机(JVM)执行。JVM是Java最...
【JAVA基础-初识JAVA】 Java是一种广泛使用的高级编程语言,由Sun Microsystems(现已被Oracle公司收购)于1995年推出。它的设计目标是“一次编写,到处运行”,这意味着编写好的Java程序可以在任何支持Java环境的...
《初识好朋友--计算机》是一堂面向初学者的IT入门课程,主要目的是让学生掌握计算机的基础知识,包括计算机的组成、开关机方法,并初步理解机房的基本要求。这堂课的教学设计紧密围绕技术主题,旨在激发学生的兴趣,...
Java ASM 是一个强大的字节码操控和分析框架,主要用于动态生成和修改Java字节码。这个库被广泛应用于创建元编程框架、代码分析工具、性能监控工具以及测试框架等领域。ASM能够直接操作字节码,使得开发者可以实现对...
5-3 初识API网关特性 - 功能聚合.mp4
### 05初识 Node.js-ev-api-server:构建API服务器详解 #### 一、项目概述与背景 在当今互联网时代,API(Application Programming Interface)已成为软件开发中的重要组成部分,它允许不同的应用程序之间相互通信...
【Java初识篇】 在Java的世界里,初学者往往会面临许多挑战,但“初识Java_课后补充作业”正是为了帮助这些新手们提供必要的学习支持。这份资料旨在加深对Java编程语言的理解,提高学习效率,使初学者能更快地掌握...
### 03 初识 Node.js - Express #### 1.1 Express 简介 - **Express** 是一个基于 **Node.js** 平台,快速、开放且极简的 Web 开发框架。 - **通俗理解**: Express 类似于 Node.js 内置的 http 模块,主要用于创建...
第01讲 初识Java.ppt
这个“Java基础精品课01-初识java”课程旨在为初学者提供一个全面的入门指南,帮助他们理解Java的核心概念和基本语法。 在Java编程语言中,我们首先会接触到的是它的关键字、数据类型以及变量。Java的关键字是预定...
Java基础精品课01-初识java录屏1.java概念简介.mp4
第1章--初识Java.ppt
在本实践课程“Java2上机实践1初识java”中,我们将深入探索Java编程的基础概念,通过一系列有趣的实例来加深理解。这个压缩包包含了实验1的相关材料,旨在引导我们逐步掌握Java语言的核心特性。 首先,我们要从"猜...
在初识人工智能的过程中,理解决策树算法至关重要,因为它易于理解,可解释性强,同时在处理分类问题时表现出良好的效果。 首先,决策树由内部节点(表示属性测试)、分支(代表特定属性的输出)和叶节点(代表类别...
Java基础精品课01-初识java录屏2.java的编译和运行.mp4
Java基础精品课01-初识java录屏6.标识符.mp4
"初识Java.zip"这个压缩包文件显然旨在帮助初学者入门Java编程。它包含的资源可能包括教学演示案例、上机练习参考答案以及课后作业参考答案,这些都是学习过程中非常重要的组成部分。 第一章"初识Java"通常会涵盖...