天天看點

一篇文章帶你搞定 Java 多線程用到的靜态代理模式

代理模式指為對象提供一種通過代理的方式來通路并控制該對象行為的方法。

在用戶端不适合或者不能夠直接引用一個對象時,可以通過該對象的代理對象來實作對該對象的通路,可以将該代理對象了解為用戶端和目标對象之間的中介者

文章目錄

    • 一、靜态代理
    • 二、多線程中的靜态代理模式

一、靜态代理

靜态代理實作的條件:真實角色,代理角色,兩者實作相同的接口

就相當于買房,可以委托房産中介,這就是把代理角色引用真實角色

My my = new My();
//代理角色中介,引入真實角色購買房的人
HouseCompany user_my = new HouseCompany(my);
           

最後是讓房産中介代理處理一些事務,但最後買房的還是自己。

真實對象可以使用代理對象的一些方法,也可以說代理對象幫我做一些事情

//買房功能的接口
interface House{           
    public void buy();
}
//my是真實角色,要實作買房接口
class My implements House{ 
    @Override
    public void buy() {
        System.out.println("購買房子");
    }
}
//房産中介是代理角色也要實作買房接口
class HouseCompany implements House{
	//代理角色對真實角色的引用,首先在代理角色中建立真實角色。
    private House user;               
    public HouseCompany(House user){
        this.user = user;
    }
	//代理角色提供的一些服務
    private void Work_1(){       
        System.out.println("找房源");
    }
    private void Work_2(){
        System.out.println("比對價格");
    }
    @Override
    public void buy() {  
    		//代理對功能進行擴充          
            Work_1();            
            Work_2();
            //代理角色中實作接口的方法
            user.buy();            
    }
}
public class Test{
    public static void main(String[] args) {
        My my = new My();
        //代理角色引用真實角色
        HouseCompany user_my = new HouseCompany (my);
        //最後買房的是自己,但可以使用代理角色提供的服務
        user_my.buy();                            
    }
}
           

二、多線程中的靜态代理模式

對應的是實作 Runnable 接口建立線程的方式

class MyThread implements Runnable{//繼承 Runnable 接口
    private String name;
    public MyThread(String name){
        this.name = name;
    }
    public void run(){//覆寫  run() 方法
        for(int i=0;i<5;i++){//循環 10 次輸出
            System.out.println(name + "運作,i = " + i);
        }
    }
}
public class Root{
    public static void main(String[] args) {
        MyThread my1 = new MyThread("線程 A");//執行個體化Runnable子類對象
        MyThread my2 = new MyThread("線程 B");//執行個體化Runnable子類對象
        Thread t1 = new Thread(my1);//執行個體化 Thread 類對象
        Thread t2 = new Thread(my2);//執行個體化 Thread 類對象
        t1.start();//啟動多線程
        t2.start();//啟動多線程
    }
}
           

(1)Runnable 接口

一篇文章帶你搞定 Java 多線程用到的靜态代理模式

(2)Thread 實作了 Runable 接口,功能類似房産中介代理,裡面對功能進行了擴充

一篇文章帶你搞定 Java 多線程用到的靜态代理模式

(3)真實對象利用代理實作接口,代理對接口進行了功能擴充,比如 Thread 代理具有線程等待,睡眠,讓步等一系列方法

//真實對象
MyThread my = new MyThread("線程 A");
//代理中引入真實對象
Thread t = new Thread(my);