Java設計模式之代理模式(3)
阿新 • • 發佈:2021-01-02
往期部落格—>Java設計模式之工廠模式(2)
今天來學習一下23種設計模式之代理模式,路漫漫其修遠兮啊,不急,慢慢來,虛心學習,一起進步.
代理模式
- 字面解釋一波
我們想到代理就會聯想到代理商,代理商乾的事就是工廠或者公司生產產品由代理商來幫忙銷售出售這些商品,我們不直接去工廠買,通過這些代理商購買產品,之前的工廠模式單例模式,類似我們直接去工廠購買.
- 定義:
在代理模式(Proxy Pattern)中,一個類代表另一個類的功能。這種型別的設計模式屬於結構型模式。在代理模式中,我們建立具有現有物件的物件,以便向外界提供功能介面。
- 代理模式的理解和作用:
1.代理模式就是給一個物件提供一個代理,並由代理物件控制對原物件的引用。它使得客戶不能直接與真正的目標物件通訊。代理物件是目標物件的代表,其他需要與這個目標物件打交道的操作都是和這個代理物件在交涉。
2.代理物件可以在客戶端和目標物件之間起到中介的作用,這樣起到了的作用和保護了目標物件的,同時也在一定程度上面減少了系統的耦合度。
比如一個實際的案例:工廠只負責生產傢俱,不幹其他事,所以我們不能買傢俱直接去工廠買,所以我們去傢俱城,裡面都是工廠生產的傢俱,我們通過傢俱城來實現去工廠購買傢俱一樣的效果,那就是買到了傢俱.
- 代理模式的優點和缺點:
優點 | 缺點 |
---|---|
1、職責清晰。 2、高擴充套件性。 3、智慧化。 | 1.由於在客戶端和真實主題之間增加了代理物件,因此有些型別的代理模式可能會造成請求的處理速度變慢。 2、實現代理模式需要額外的工作,有些代理模式的實現非常複雜。 |
- 代理模式的中有三種角色:
Subject: 抽象主題角色 | Proxy: 代理主題角色 | RealSubject: 真實主題角色 |
---|
代理模式的簡單java程式碼實現:
- 整體構建的介面和類的說明:
介面或者類 | 說明 |
---|---|
interface bed | 定義一個床的介面 |
class Simmons | 定義一個席夢思類實現這個床的介面 |
class AgentSimmons | 定義一個代理席夢思類,由這個類來獲取席夢思類 |
- 程式碼實現:
interface bed{
void sleep();
}
class Simmons implements bed{
private String name;
public Simmons(String name){
this.name=name;
buy(name);
}
@Override
public void sleep() {
System.out.println("舒舒服服睡一覺");
}
private void buy(String name){
System.out.println(name+"正在購買中");
}
}
class AgentSimmons implements bed{
private Simmons simmons;
private String name;
public AgentSimmons(String name){
this.name=name;
}
@Override
public void sleep() {
if (simmons == null){
simmons=new Simmons(name);
}
simmons.sleep();
}
}
- 測試一波:
public class Mytest03 {
public static void main(String[] args) {
bed simmons=new AgentSimmons("程式逸牌席夢思");
simmons.sleep();
System.out.println("-----");
simmons.sleep();
}
}
- 結果:
總結
- 我們沒有直接建立Simmons這個具體實現類物件,而是通過代理類AgentSimmons使用介面獲取的,因為當Simmons有這個類時,我們可以通過代理類來實現和真實類一樣的功能,也就是我們之前說的,工廠雖然一直生產傢俱,但我們沒必要直接去工廠買,我們去代理商購買可以實現一樣的效果,我們的案例就是傳入一個席夢思牌子,然後能睡覺就行.