代理:
当一个类无法直接访问目标类时,就需要代理类来访问,客户类再访问代理类来实现功能
真实示例:
房东有一个房子,出租。租客无法直接访问到房东,需要通过中介联系租房,并收取费用
作用:
1.控制访问
2.功能增强
静态代理:
代理类是手动实现的java文件,同时代理的目标类是规定的;
优点:容易理解,使用方便
缺点:在目标类较多时,会产生大量的代理类,当接口改变时,影响范围较大,改动较多
动态代理:
使用反射机制,在程序执行中,创建代理类对象,
特点:不用创建类文件,代理的目标类是活动的,可设置的
实现方式:
1.jdk动态代理(理解),使用java反射包中的类和接口实现动态代理的功能
反射包:java.lang.reflect
类:invocationHandler,Method,Proxy
2.cglib动态代理(了解)
静态代理栗子:
public interface Sell { float sell(Integer amount); }
工厂
package com.demo.factory; import com.demo.service.Sell; public class GoldKingFactory implements Sell{ @Override public float sell(Integer amount) { return 85.0f; } }
商家:
package com.demo.shangjia; import com.demo.factory.GoldKingFactory; import com.demo.service.Sell; public class TaoBao implements Sell { private GoldKingFactory kingFactory = new GoldKingFactory(); @Override public float sell(Integer amount) { float price = kingFactory.sell(1); price +=20; System.out.println("翻了优惠券"); return price; } }
顾客:
package com.demo.customer; import com.demo.shangjia.TaoBao; public class man { public static void main(String[] args) { TaoBao taoBao = new TaoBao(); float price = taoBao.sell(1); System.out.println(price); } }