一、概念
代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。重要的编程思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法。
二、Java中的代理
定义:给目标对象提供一个代理对象,并且由代理对象控制对目标对象的引用
目的:
①:通过代理对象的方式间接的访问目标对象,防止直接访问目标对象给系统带来不必要的复杂性
②:通过代理业务对原有业务进行增强
相关概念:
目标类:原对象,我们需要代理对象控制他的访问,拓展其功能。
代理类:代理模式产生的对象,是原对象“替身”,已经在原有基础上修改逻辑。
总结来说,java当中有三种方式来创建代理对象:静态代理,基于jdk(接口)的动态代理,基于CGLLIB(父类)的动态代理。
三、静态代理
1.目标对象
//目标接口,被代理的业务 买衣服的业务
public interface ByClothes {
void clothes(String size);
}
//实现功能的类 制衣工厂
public class ClothesFactory implements ByClothes {
@Override
public void clothes(String size) {
System.out.println("已经为您制作好了一整套size为"+size+"的衣服。。。。。。。。");
}
}
2.代理对象
//代理类 代购
public class proxy implements ByClothes {
//被包含的真实对象
public ClothesFactory factory;
public proxy(ClothesFactory factory) {
// TODO Auto-generated constructor stub
this.factory = factory;
}
@Override
public void clothes(String size) {
FrontService();
factory.clothes(size);
endService();
}
//前置服务
public void FrontService() {
System.out.println("根据您的需求进行市场调研");
}
//前置服务
public void endService() {
System.out.println("为您提供一条龙的包办服务");
}
}
3.代理测试
调用代理类,通过代购实现买衣服,目标类的引用被代理类控制。
public class Test {
public static void main(String[] args) {
ClothesFactory clothesFactory = new ClothesFactory();
proxy proxy = new proxy(clothesFactory);
proxy.clothes("XXl");
}
}
4.存在问题
违反了开闭原则:程序对访问开放,对修改关闭,换句话来说,当需求发生变化时,我们可以增加新模块来解决新需求,而不是通过该变原来的代码来解决我们的新需求。