1. 代理的意思
代理就是代替别人处理,在面向对象里面就是一个对象代替另一个对象做事。那肯定是做的一个事,比如代替另一个对象去买菜,代替去排队。
代理对象和被代理对象都得能做这件事,怎么保证这一点,都实现一个接口就可以了。因为实现接口的对象必须实现接口定义的方法,这样就保证了代理对象是有能力做这件事的。
2. 一个完美的代理模式场景——代驾
喝酒不开车这个道理都懂,但是开车到了场合实在是想喝酒咋办,没事,叫代驾。
先分析这个场景有几种元素:
1、首先得有车,没车叫啥代驾
2、得有个喝醉酒的司机,当然这个司机得有驾照,得能开车
3、得有个代驾,代驾负责将车开回家。
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(); } }