1. 程式人生 > >JAVA設計模式——代理(靜態代理)

JAVA設計模式——代理(靜態代理)

具體實現 使用 *** inter ali pro eal 成功 dem

定義

為其它的對象提供一種代理,以控制這個對象的訪問

使用場景

當不想直接訪問某個對象的時候,就可以通過代理

1.不想買午餐,同事幫忙帶
2.買車不用去廠裏,去4s店
3.去代理點買火車票,不用去車站

UML

技術分享圖片

介紹下上面的UML圖的意思,以購買火車票為例:

定義代理的接口,買票

1)IProxy


代理的對象,完成代理的任務,設置具體的代理,調用具體的代理方法等

2)ProxyObject

被代理對象,處理具體的業務邏輯

3)RealObject

代碼實現

上面我們已經很清晰的明白了他們之間的關系,所以接下來就用代碼演示,將上面我們的想法和邏輯用代碼表現出來:

(1)定義代理接口

package com.zengtao.demo.proxy;

public interface IProxy {

    void buyTicket();

}

(2)代理類

package com.zengtao.demo.proxy;

/**
 * 代理
 */
public class Proxy implements IProxy {

    private RealProxy realClient;

    public Proxy(RealProxy realClient) {
        this.realClient = realClient;
    }

    @Override
    
public void buyTicket() { realClient.buyTicket(); } }

(3)被代理對象買票

package com.zengtao.demo.proxy;

import com.zengtao.demo.bean.User;

/**
 * 具體代理買票
 */
public class RealProxy implements IProxy {

    private User user;

    public RealProxy() {

    }

    public RealProxy(User user) {
        
this.user = user; } public void setUser(User user) { this.user = user; } @Override public void buyTicket() { // 具體實現邏輯 if (user != null) { System.out.println("***********我要買票***********"); System.out.println("信息如下:"); System.out.println("姓名:" + user.getName()); System.out.println("性別:" + user.getSex()); System.out.println("身份證號:" + user.getCardCode()); System.out.println("住址:" + user.getHomeAddress()); System.out.println("***********信息已核對***********"); System.out.println("出票成功:動車D2222次09車20A"); } } }

(4)用戶對象

package com.zengtao.demo.bean;

import java.io.Serializable;

@SuppressWarnings("serial")
public class User implements Serializable {

    private String cardCode;
    private String name;
    private String homeAddress;
    private String sex;

    public String getCardCode() {
        return cardCode;
    }

    public void setCardCode(String cardCode) {
        this.cardCode = cardCode;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getHomeAddress() {
        return homeAddress;
    }

    public void setHomeAddress(String homeAddress) {
        this.homeAddress = homeAddress;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}

(6)具體調用

package com.zengtao.demo;

import com.zengtao.demo.bean.User;
import com.zengtao.demo.proxy.Proxy;
import com.zengtao.demo.proxy.RealProxy;

public class Main {

    public static void main(String[] str) {
        // 用戶信息
        User user = new User();
        user.setCardCode("510522177709096836");
        user.setSex("男");
        user.setName("無名氏");
        user.setHomeAddress("地球村第七號店鋪");

        // 具體代理
        RealProxy realClient = new RealProxy();
        realClient.setUser(user);

        // 代理
        Proxy proxy = new Proxy(realClient);
        proxy.buyTicket();
    }
}

(7)結果

技術分享圖片

以上以代理模式的方式,簡陋的實現了購票的流程。

總結

  大家也可以看到,其實代理模式,說白了就是委托,將所有的事情都委托給別人幫你完成,你所要做的,就是給代理一些東西,接下來所有的事情都是代理幫你完成,你完全不用去關心內部是如何實現的。

代理模式:一般可以分為兩種,一種為靜態代理,一種為動態代理

(1)靜態代理

靜態代理:就是我們上述所寫的,代理代碼是由我們自己去生成的固定的代碼進行編譯

(2)動態代理

動態代理:動態代理,跟靜態代理相反,它是用反射機制動態的生成代理的對象,我們不需要知道誰代理誰

傳送門:JAVA設計模式——代理(靜態代理)

JAVA設計模式——代理(靜態代理)