《大話設(shè)計(jì)模式》閱讀筆記和總結(jié)。原書(shū)是C#編寫(xiě)的愁溜,本人用Java實(shí)現(xiàn)了一遍逼争,包括每種設(shè)計(jì)模式的UML圖實(shí)現(xiàn)和示例代碼實(shí)現(xiàn)搓蚪。
目錄:設(shè)計(jì)模式
Github地址:DesignPattern
說(shuō)明
定義:代理模式(Proxy)郭蕉,為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)疼邀。
UML圖:
代碼實(shí)現(xiàn):
Subject類,定義了RealSubject和Proxy的共用接口召锈,這樣就在任何使用RealSubject的地方都可以使用Proxy
abstract class Subject{
public abstract void Request();
}
RealSubject類旁振,定義Proxy所代表的真實(shí)實(shí)體
class RealSubject extends Subject{
@Override
public void Request() {
System.out.println("真實(shí)的請(qǐng)求");
}
}
Proxy類,保存一個(gè)引用使得代理可以訪問(wèn)實(shí)體涨岁,并提供一個(gè)與Subject的接口相同的接口拐袜,這樣代理就可以用來(lái)替代實(shí)體
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();
}
}
運(yùn)行結(jié)果
真實(shí)的請(qǐng)求
示例
例子:小賈喜歡嬌嬌,但是不敢親自表白梢薪,于是他讓小戴替他送洋娃娃蹬铺、送鮮花、送巧克力給嬌嬌沮尿。用程序模擬這個(gè)過(guò)程丛塌。
UML圖:
代碼實(shí)現(xiàn):
代理接口
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();
}
}
運(yùn)行結(jié)果:
李嬌嬌,送你洋娃娃
李嬌嬌,送你鮮花
李嬌嬌,送你巧克力