代理就是代替别人处理,在面向对象里面就是一个对象代替另一个对象做事。那肯定是做的一个事,比如代替另一个对象去买菜,代替去排队。
代理对象和被代理对象都得能做这件事,怎么保证这一点,都实现一个接口就可以了。因为实现接口的对象必须实现接口定义的方法,这样就保证了代理对象是有能力做这件事的。
一个完美的代理模式场景——代驾喝酒不开车这个道理都懂,但是开车到了场合实在是想喝酒咋办,没事,叫代驾。
先分析这个场景有几种元素:
1、首先得有车,没车叫啥代驾
2、得有个喝醉酒的司机,当然这个司机得有驾照,得能开车
3、得有个代驾,代驾负责将车开回家。
实现先来辆车
package org.demo.proxy;
/**
* 汽车
*/
public class Car {
private String carName;//汽车名字
public String getCarName() {
return carName;
}
public void setCarName(String carName) {
this.carName = carName;
}
}
然后保证能开车的资格,实际上就是司机认证
package org.demo.proxy;
/**
* 代理接口-表示拥有驾驶者资格-喝酒的司机和代驾都拥有驾驶者资格
*/
public interface IDriver {
/**
* 开车
*/
void driveCar();
}
如果没代驾,司机自己开车很危险
package org.demo.proxy;
/**
* 喝酒的司机
*/
public class DrinkedDriver implements IDriver{
/**
* 私有轿车
*/
private Car car;
public DrinkedDriver(Car car) {
this.car=car;
}
@Override
public void driveCar() {
System.out.println("DrinkedDriver的"+car.getCarName()+"在行驶");
}
public static void main(String[] args) {
//在这个故事里有一辆车
Car car=new Car();
//车的名字是奔驰
car.setCarName("奔驰");
//有一个喝了酒的司机,开奔驰,这是违法行为
DrinkedDriver dDriver=new DrinkedDriver(car);
dDriver.driveCar();
}
}
叫了代驾,安全回家
package org.demo.proxy;
/**
* 代驾
*
* @author easypanda
*/
public class ProxyDriver implements IDriver {// 代驾必须得有驾照,不然代理别人开车?
/**
* 代驾不需要有车,代驾有客户——醉酒司机
*/
private DrinkedDriver dDriver;
/**
* 每次开始业务的时候还是需要先找到客户的车
*/
public ProxyDriver(Car car) {
this.dDriver = new DrinkedDriver(car);// 现在代驾知道了客户和客户的车,可以把客户放车上,代驾坐驾驶位
}
@Override
public void driveCar() {
System.out.println("代驾接管车钥匙");
dDriver.driveCar();
System.out.println("代驾安全将客户送至家中");
}
public static void main(String[] args) {
// 在这个故事里有一辆车
Car car = new Car();
// 车的名字是奔驰
car.setCarName("奔驰");
// 有一个代驾找到了喝酒司机的车
ProxyDriver pDriver=new ProxyDriver(car);
pDriver.driveCar();
}
}