代理就是代替別人處理,在面向?qū)ο罄锩婢褪且粋€(gè)對象代替另一個(gè)對象做事。那肯定是做的一個(gè)事,比如代替另一個(gè)對象去買菜,代替去排隊(duì)。
代理對象和被代理對象都得能做這件事,怎么保證這一點(diǎn),都實(shí)現(xiàn)一個(gè)接口就可以了。因?yàn)閷?shí)現(xiàn)接口的對象必須實(shí)現(xiàn)接口定義的方法,這樣就保證了代理對象是有能力做這件事的。
一個(gè)完美的代理模式場景——代駕
喝酒不開車這個(gè)道理都懂,但是開車到了場合實(shí)在是想喝酒咋辦,沒事,叫代駕。
先分析這個(gè)場景有幾種元素:
1、首先得有車,沒車叫啥代駕
2、得有個(gè)喝醉酒的司機(jī),當(dāng)然這個(gè)司機(jī)得有駕照,得能開車
3、得有個(gè)代駕,代駕負(fù)責(zé)將車開回家
package org.demo.proxy;
/**
* 汽車
*/
public class Car {
private String carName;//汽車名字
public String getCarName() {
return carName;
}
public void setCarName(String carName) {
this.carName = carName;
}
}
然后保證能開車的資格,實(shí)際上就是司機(jī)認(rèn)證
package org.demo.proxy;
/**
* 代理接口-表示擁有駕駛者資格-喝酒的司機(jī)和代駕都擁有駕駛者資格
*/
public interface IDriver {
/**
* 開車
*/
void driveCar();
}
如果沒代駕,司機(jī)自己開車很危險(xiǎn)
/**
* 喝酒的司機(jī)
*/
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) {
//在這個(gè)故事里有一輛車
Car car=new Car();
//車的名字是奔馳
car.setCarName("奔馳");
//有一個(gè)喝了酒的司機(jī),開奔馳,這是違法行為
DrinkedDriver dDriver=new DrinkedDriver(car);
dDriver.driveCar();
}
}
叫了代駕,安全回家
/**
* 代駕
*
* @author easypanda
*/
public class ProxyDriver implements IDriver {// 代駕必須得有駕照,不然代理別人開車?
/**
* 代駕不需要有車,代駕有客戶——醉酒司機(jī)
*/
private DrinkedDriver dDriver;
/**
* 每次開始業(yè)務(wù)的時(shí)候還是需要先找到客戶的車
*/
public ProxyDriver(Car car) {
this.dDriver = new DrinkedDriver(car);// 現(xiàn)在代駕知道了客戶和客戶的車,可以把客戶放車上,代駕坐駕駛位
}
@Override
public void driveCar() {
System.out.println("代駕接管車鑰匙");
dDriver.driveCar();
System.out.println("代駕安全將客戶送至家中");
}
public static void main(String[] args) {
// 在這個(gè)故事里有一輛車
Car car = new Car();
// 車的名字是奔馳
car.setCarName("奔馳");
// 有一個(gè)代駕找到了喝酒司機(jī)的車
ProxyDriver pDriver=new ProxyDriver(car);
pDriver.driveCar();
}
}