天天看點

Java設計模式——代理模式執行個體

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