您的位置:首页 > 其它

简单理解常用设计模式(五)代理模式

2018-03-05 15:01 603 查看
代理模式:为其他对象提供一种代理,以控制对这个对象的访问

这里说明代理模式,这是一个平常开发自己不太会用到,但实际作用不小的模式。
以原书送礼物为场景:人物a要给人物b送礼物,但又不想让人物b知道是自己送的,所以找来了人物c来代替自己送礼物。
UML如下:



调用类如下:package com.gcc.proxyModel;
/**
* 代理模式
*
*/
public class TestProxy {

public static void main(String[] args) {
BeautifulGirl girl = new BeautifulGirl("翠花");
Proxy prox = new Proxy(girl);
prox.giveBags();
prox.giveDolls();
prox.giveFlowers();

}

}
人物b类如下:package com.gcc.proxyModel;

public class BeautifulGirl {

private String name;

public BeautifulGirl() {
super();
}

public BeautifulGirl(String name) {
super();
this.name = name;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

}
人物c类如下:package com.gcc.proxyModel;

public class Proxy implements ProxyAction{

ActualMaster master;

public Proxy() {
super();
}

/**
* 让代理(人)知道要追个那个女生,实例化真正的追求者对象,代替他执行那些送礼物的动作
* @param girl
*/
public Proxy(BeautifulGirl girl) {
master=new ActualMaster(girl);
}

@Override
public void giveDolls() {
master.giveDolls();
}

@Override
public void giveFlowers() {
master.giveFlowers();
}

@Override
public void giveBags() {
master.giveBags();
}

}
共用接口如下:package com.gcc.proxyModel;

public interface ProxyAction {

public void giveDolls();
public void giveFlowers();
public void giveBags();

}
人物a类如下:package com.gcc.proxyModel;

public class ActualMaster implements ProxyAction {

BeautifulGirl girl;

public ActualMaster() {
super();
}

/**
* 初始化真正的追求者,并且初始化被追求的人的姓名,用来显示打印
* @param girl
*/
public ActualMaster(BeautifulGirl girl) {
super();
this.girl = girl;
}

@Override
public void giveDolls() {
System.out.println(this.girl.getName()+"送你玩偶");
}

@Override
public void giveFlowers() {
System.out.println(this.girl.getName()+"送你花");
}

@Override
public void giveBags() {
System.out.println(this.girl.getName()+"送你包");
}

}
设计思路非常清晰,让代理类知道(包含)真正送礼物的类ActualMaster,然后两者都实现送礼物接口,在代理类里执行ActualMaster对象的方法,达到送礼物的目的。而翠花是不知道究竟是谁送的,只知道代理对象。
实际应用场景也不少,笔者举常见的两例:
一、虚拟代理,例如HTML图片的异步加载,那些未打开的图片框就是通过虚拟代理来替换的真实的图片,此时代理主要储存了真实图片的路径和尺寸
二、安全代理,用来控制真实对象访问时的权限
代理也可以理解成委托,在自己不想参与某个操作或不会某个操作时可以通过代理来完成。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: