java中的代理模式:
*定义:给目标对象提供一个代理对象,并且由代理对象控制对目标对象的引用
*目的:①:通过代理对象的方式间接的访问目标对象,防止直接访问目标对象给系统带来不必要 的复杂性
②:通过代理业务对原有业务进行增强
java当中有三种方式来创建代理对象:静态代理,基于jdk(接口)的动态代理,基于CGLLIB(父类)的动态代理。
相关概念:
目标类:原对象,我们需要代理对象控制他的访问,拓展其功能。
代理类:代理模式产生的对象,是原对象“替身”,已经在原有基础上修改逻辑
--------------------------------------------------------------------------------------------------------------------------------
静态代理:
编写代理类:实现目标的接口或者直接继承目标类,完成逻辑的修改
接口实现方式:目标类接口,目标类,代理类。目标类和代理类都必须实现目标接口当中所实现的方法,从某种意义上代理类就可以帮我们实现目标类当中的方法,并且代理类还可以有自己的扩展方法。
例子:买商品,原本直接去商品制造的工厂买。
现在我找代购的买,不直接找工厂了。并且代购方还会有许多其他服务。
对用户来说,就只是 买商品这个功能,我能买到就行,通过代购我还能有其他服务。何乐而不为?
定义一个接口,相当于 商品生产这个功能
public interface Goods {
void goods(String size);
}
定义一个目标类,实现这个接口,原本直接买商品的地方 也是 生产这个商品的地方
public class Factory implements Goods {
@Override
public void goods(String size) {
System.out.println("生产出大小为"+size+"的商品");
}
}
定义一个代理类,代购
public class Proxy implements Goods {
//被包含的真是对象
public Factory factory;
//构造函数
public Proxy(Factory factory) {
// TODO Auto-generated constructor stub
this.factory = factory;
}
@Override
public void goods(String size) {
factory.goods(size);
OtherA();
OtherB();
}
//下方就是对目标类的功能的拓展。根据自己需求写
//其他功能
public void OtherA() {
System.out.println("功能A");
}
//其他功能
public void OtherB() {
System.out.println("功能B");
}
}
main函数 ,买商品的人
public class Test {
public static void main(String[] args) {
Factory factory = new Factory();
Proxy proxy = new Proxy(factory);
proxy.goods("XXl");
}
}
目标对象必须实现我们的接口,同时代理对象也必须实现这一接口
---------------------------------------------------------------------------------------------------------------------------------
静态代理存在的问题
违反了开闭原则:
程序对访问开放,对修改关闭,当需求发生变化时,可以增加新模块来解决新需求,而不是改变原来的代码来解决新需求