代理模式定义:
为其他对象提供一种代理,以控制对这个对象的访问
代理对象起到中介作用,可以去掉功能服务或增加额外的服务。
代理模式分为:
远程代理,
虚拟代理,根据需要将资源消耗很大的对象进行延迟,真正需要的时候进行创建
保护代理,控制对一个对象的访问权限
智能引用代理:提供对目标对象额外的服务。
我们以智能引用代理为例来讲解。
智能引用代理有两种实现方式,静态代理和动态代理。
静态代理:代理和被代理对象在代理之前是确定的。他们都实现了相同的接口或者继承相同的抽象类
静态代理有两种实现方式:聚合,继承
public interface Moveable {
public void move();
}
import java.util.Random;
public class Car implements Moveable {
@Override
public void move() {
// TODO Auto-generated method stub
try {
Thread.sleep(new Random().nextInt(1000));
System.out.println("汽车行驶中.....");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
下面是继承的方式
public class Car2 extends Car {
@Override
public void move() {
// TODO Auto-generated method stub
long starttime = System.currentTimeMillis();
System.out.println("汽车开始行驶.....");
super.move();
long endtime = System.currentTimeMillis();
System.out.println("汽车结束行驶.....时间为:" + (endtime - starttime) + "(毫秒)");
}
}
下面是聚合的方式
public class Car3 implements Moveable {
private Car car;
public Car3(Car car) {
super();
this.car = car;
}
@Override
public void move() {
// TODO Auto-generated method stub
long starttime = System.currentTimeMillis();
System.out.println("汽车开始行驶.....");
car.move();
long endtime = System.currentTimeMillis();
System.out.println("汽车结束行驶.....时间为:" + (endtime - starttime) + "(毫秒)");
}
}
public class Client {
/*
* 测试类
*/
public static void main(String[] args) {
// Car car = new Car();
// car.move();
//使用继承方式
// Moveable m = new Car2();
// m.move();
//使用聚合方式
Car car = new Car();
Moveable m = new Car3(car);
m.move();
}
}
我们一般不使用继承的方式代理