《大話設計模式》閱讀筆記和總結。原書是C#編寫的,本人用Java實作了一遍,包括每種設計模式的UML圖實作和示例代碼實作。
目錄:
設計模式 Github位址: DesignPattern
說明
定義:代理模式(Proxy),為其他對象提供一種代理以控制對這個對象的通路。
UML圖:
代理模式UML圖.png
代碼實作:
Subject類,定義了RealSubject和Proxy的共用接口,這樣就在任何使用RealSubject的地方都可以使用Proxy
abstract class Subject{
public abstract void Request();
}
RealSubject類,定義Proxy所代表的真實實體
class RealSubject extends Subject{
@Override
public void Request() {
System.out.println("真實的請求");
}
}
Proxy類,儲存一個引用使得代理可以通路實體,并提供一個與Subject的接口相同的接口,這樣代理就可以用來替代實體
class ProxyI extends Subject{
private RealSubject realSubject;
@Override
public void Request() {
if (realSubject == null){
realSubject = new RealSubject();
}
realSubject.Request();
}
}
用戶端代碼
public class ProxyPattern {
public static void main(String[] args){
ProxyI proxyI = new ProxyI();
proxyI.Request();
}
}
運作結果
真實的請求
示例
例子:小賈喜歡嬌嬌,但是不敢親自表白,于是他讓小戴替他送洋娃娃、送鮮花、送巧克力給嬌嬌。用程式模拟這個過程。
代理模式示例UML圖.png
代理接口
public interface GiveGift {
void giveDolls();
void giveFlowers();
void giveChocolate();
}
被追求者類
public class SchoolGirl {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
追求者類
public class Pursuit implements GiveGift {
private SchoolGirl mm;
public Pursuit(SchoolGirl mm) {
this.mm = mm;
}
@Override
public void giveDolls() {
System.out.println(mm.getName()+",送你洋娃娃");
}
@Override
public void giveFlowers() {
System.out.println(mm.getName()+",送你鮮花");
}
@Override
public void giveChocolate() {
System.out.println(mm.getName()+",送你巧克力");
}
}
代理類
public class Proxy implements GiveGift{
private Pursuit gg;
public Proxy(SchoolGirl mm){
gg = new Pursuit(mm);
}
@Override
public void giveDolls() {
gg.giveDolls();
}
@Override
public void giveFlowers() {
gg.giveFlowers();
}
@Override
public void giveChocolate() {
gg.giveChocolate();
}
}
public class Main {
public static void main(String[] args){
SchoolGirl jiaojiao = new SchoolGirl();
jiaojiao.setName("李嬌嬌");
Proxy proxy = new Proxy(jiaojiao);
proxy.giveDolls();
proxy.giveFlowers();
proxy.giveChocolate();
}
}
運作結果:
李嬌嬌,送你洋娃娃
李嬌嬌,送你鮮花
李嬌嬌,送你巧克力