JAVA关键字——interface的使用之静态代理(三)
一、什么是代理
用一个例子来解释:
安公司(一个类A)有设计衣服(成员方法1)、生产衣服(成员方法2)的功能,
生产衣服的工厂(另一个类B)有生产衣服(成员方法2)、运送(成员方法3)的功能能,
所以安公司可以把它的衣服拿给生产衣服的工厂去生产,这就是让工厂去 代理 生产安的衣服。
好处:安公司可以专注于设计衣服,不用去担心生衣服环节。
放到代码中来看就是类B去代理类A的功能。
二、什么是静态代理:
根据被代理类,我创建一个跟被代理类实现一样接口的类,然后代理 代理类 去执行一些功能。这里使用一个例子来说明:
三、静态代理的实现:
/*
这是生产衣服的接口,anta和Factory都会具有这个功能,所以把它抽取出来放在
一个接口中。
*/
interface ProduceCloth{
void product();
}
class AnTa implements ProduceCloth{
@Override
public void product() {
System.out.println("我是安公司(被代理类)");
}
}
//代理类
class Factory implements ProduceCloth{
//我是代理类,我要传入我代理的对象,因为代理类和被代理类都实现了接口,所以可以直接用obj来传参;
private ProduceCloth obj;
public Factory(){}
public Factory(ProduceCloth obj){
this.obj = obj;
}
@Override
public void product() {
//除了obj.product()外其他代码都是代理类的,
//也就是代理类可以帮你做一些额外的事情!
System.out.println("我帮安公司生产衣服(代理类)");
obj.product();
System.out.println("我帮安公司生产衣服结束(代理类)");
}
}
public class EStaticProxy {
public static void main(String[] args){
//实例化被代理类
ProduceCloth anta = new AnTa();
//告诉代理类:被代理类是anta,然后生成一个为anta代理的工厂factory
//这里使用的是带参的构造器,把被代理对象传递给代理工厂
ProduceCloth factory = new Factory(anta);
//让工厂开始去生产
factory.product();
}
}
思路:
1、既然是代理,必然有两个类,一个是代理类(工厂),一个是被代理类(安公司);
2、既然能代理,必然有一样的功能(ProduceCloth),把这个功能抽象放到接口中,然这两个类都去实现它。
然后需要注意的是,因为代理类要执行的功能其实是被代理类要执行的功能,所以代理类去实现这个接口后它的方法体应该是去调用被代理类实现接口的方法,这里要稍加思考一下哦!
public void product() {
//除了obj.product()外其他代码都是代理类的,
//也就是代理类可以帮你做一些额外的事情!
System.out.println("我帮安公司生产衣服(代理类)");
obj.product();
System.out.println("我帮安公司生产衣服结束(代理类)");
}
这就引出一个问题,这个obj是谁?
既然是调用被代理类的方法,那obj必然就是被代理类了。所以在代理类中可以使用带参的构造器来创建代理对象,这个参数就是被代理类obj。
private ProduceCloth obj;
public Factory(){}
public Factory(ProduceCloth obj){
this.obj = obj;
}
所以代理类的写法就是这样了:
//代理类
class Factory implements ProduceCloth{
//我是代理类,我要传入我代理的对象,因为代理类和被代理类都实现了接口,所以可以直接用obj来传参;
private ProduceCloth obj;
public Factory(){}
public Factory(ProduceCloth obj){
this.obj = obj;
}
@Override
public void product() {
//除了obj.product()外其他代码都是代理类的,
//也就是代理类可以帮你做一些额外的事情!
System.out.println("我帮安公司生产衣服(代理类)");
obj.product();
System.out.println("我帮安公司生产衣服结束(代理类)");
}
}
3、既然要代理,必然要让代理类知道谁被代理,那就在构造器中传入被代理对象就好了
//实例化被代理类
ProduceCloth anta = new AnTa();
//告诉代理类:被代理类是anta,然后生成一个为anta代理的工厂factory
//这里使用的是带参的构造器,把被代理对象传递给代理工厂
ProduceCloth factory = new Factory(anta);
//让工厂开始去生产
factory.product();
以上就是笔者对静态代理的学习笔记,不足之处还望各位朋友指出呀!