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();
}
}