1. 程式人生 > 其它 >Java靜態代理模式

Java靜態代理模式

技術標籤:代理模式靜態代理模式proxy代理模式靜態代理模式proxyJava代理模式Java靜態代理模式

學習代理模式之前一定要清楚一個點:什麼是代理模式,即代理物件是目標物件的擴充套件,並且代理物件會呼叫目標物件。

靜態代理模式在使用時,必須定義介面或者父類,並且代理物件與目標物件必須一起實現相同的介面或者繼承相同的父類。

在這裡,代理物件和目標物件不實現共同的介面或繼承相同的父類也同樣能夠呼叫目標物件的方法,但是實現了相同的介面或繼承相同的父類就能保證代理物件和目標物件有相同的約束,這樣才符合代理的意義(就像買電腦,如果代理商和廠家達不成協議,代理商就無法替廠家代理)。

下面以客戶買電腦為例,實現靜態代理模式:

代理類和目標類都要實現的介面:

package proxy.staticProxy.proxy;

/*
* 靜態代理模式
* */
public interface UserDao {
    void buy(double money);
}

目標類:

package proxy.staticProxy.proxy;

public class UserDaoImpl implements UserDao {
    public void buy(double money) {
        System.out.println("廠家收到的貨款是: " + money);
    }
}

代理類:

package proxy.staticProxy.proxy;

public class UserProxy implements UserDao {

    private UserDao userDao;

    public UserProxy(UserDao userDao) {
        this.userDao = userDao;
    }

    public void buy(double money) {
        //代理賺取20%的利潤,80%給給廠家
        System.out.println("代理商賺取了20%的利潤,利潤總值為: " + money * 0.2);
        userDao.buy(money * 0.8);
    }
}

測試類:

package proxy.staticProxy.proxy;

public class Test {
    public static void main(String[] args) {
        //目標物件
        UserDaoImpl userDao = new UserDaoImpl();
        //代理物件,把目標物件傳給代理物件,建立代理關係
        UserProxy proxy = new UserProxy(userDao);
        //執行代理方法,在代理方法中做業務處理
        double money = 9000.0;
        System.out.println("客戶出價9000購買膝上型電腦,9000元交到代理商手裡");
        proxy.buy(money);
    }
}

執行結果: