代理模式
代理模式:为其他对象提供一种代理以控制对这个对象的访问。代理为真实对象的代表
实例:追求者案例
源代码1:无代理模式
package org.zangyu.Agency;
public class Agency {
public static void main(String[] args) {
// TODO Auto-generated method stub
SchoolGirl jiaojiao =new SchoolGirl();//创建被追求者
jiaojiao.setName("李娇娇");//初始化被追求者
Pursuit zhuojiayi =new Pursuit(jiaojiao);//初始化追求者
zhuojiayi.GiveDolls();//追求方式
zhuojiayi.GiveFlowers();
zhuojiayi.GiveChocolate();
}
}
class Pursuit
{//追求者
SchoolGirl mm;//追求对象
public Pursuit(SchoolGirl mm)
{
this.mm=mm;
}
//追求方式
public void GiveDolls()
{
System.out.println(mm.getName()+"送你洋娃娃");
}
public void GiveFlowers()
{
System.out.println(mm.getName()+"送你花");
}
public void GiveChocolate()
{
System.out.println(mm.getName()+"送你巧克力");
}
}
class SchoolGirl
{//被追求者
private String name;
public String getName()
{
return name;
}
public void setName(String value)
{
name=value;
}
}
该场景的前提:
卓贾易喜欢娇娇,但是,娇娇不认识卓贾易
1.卓贾易给娇娇送花,送巧克力,送洋娃娃
2.卓贾易也可以找一个人,让这个人把鲜花,巧克力和洋娃娃送给娇娇。
两种方式,同一种目的。
源代码2:带有代理者
package org.zangyu.Agency;
public class Agency1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
SchoolGirl jiaojiao =new SchoolGirl();//创建被追求者
jiaojiao.setName("李娇娇");//初始化被追求者
Proxy zhuojiayi =new Proxy(jiaojiao);//初始化追求者
zhuojiayi.GiveDolls();//追求方式
zhuojiayi.GiveFlowers();
zhuojiayi.GiveChocolate();
}
}
class Proxy
{//代理者
SchoolGirl mm;
public Proxy(SchoolGirl mm)
{
this.mm=mm;
}
//追求方式
public void GiveDolls()
{
System.out.println(mm.getName()+"送你洋娃娃");
}
public void GiveFlowers()
{
System.out.println(mm.getName()+"送你花");
}
public void GiveChocolate()
{
System.out.println(mm.getName()+"送你巧克力");
}
}
class Pursuit
{//追求者
SchoolGirl mm;//追求对象
public Pursuit(SchoolGirl mm)
{
this.mm=mm;
}
//追求方式
public void GiveDolls()
{
System.out.println(mm.getName()+"送你洋娃娃");
}
public void GiveFlowers()
{
System.out.println(mm.getName()+"送你花");
}
public void GiveChocolate()
{
System.out.println(mm.getName()+"送你巧克力");
}
}
class SchoolGirl
{//被追求者
private String name;
public String getName()
{
return name;
}
public void setName(String value)
{
name=value;
}
}
代理者变追求者,被追求者错认为是代理者在追求她
改进——代理模式
package org.zangyu.Agency;
public class Agency20 {
public static void main(String[] args) {
// TODO Auto-generated method stub
SchoolGirl jiaojiao =new SchoolGirl();//创建被追求者
jiaojiao.setName("李娇娇");//初始化被追求者
Proxy agency =new Proxy(jiaojiao);//初始化代理者
agency.GiveDolls();//代理者传达追求者的追求方式
agency.GiveFlowers();
agency.GiveChocolate();
}
}
interface IGiveGift
{//追求方法接口
void GiveDolls();
void GiveFlowers();
void GiveChocolate();
}
class Proxy implements IGiveGift
{//代理者
Pursuit gg;
public Proxy(SchoolGirl mm)
{
gg=new Pursuit(mm);
}
//代理负责送礼物以追求者的名义
public void GiveDolls()
{
gg.GiveDolls();
}
public void GiveFlowers()
{
gg.GiveFlowers();
}
public void GiveChocolate()
{
gg.GiveChocolate();
}
}
class Pursuit implements IGiveGift
{//追求者
SchoolGirl mm;//追求对象
public Pursuit(SchoolGirl mm)
{
this.mm=mm;
}
//追求方式
public void GiveDolls()
{
System.out.println(mm.getName()+"送你洋娃娃");
}
public void GiveFlowers()
{
System.out.println(mm.getName()+"送你花");
}
public void GiveChocolate()
{
System.out.println(mm.getName()+"送你巧克力");
}
}
class SchoolGirl
{//被追求者
private String name;
public String getName()
{
return name;
}
public void setName(String value)
{
name=value;
}
}
让代理以追求者的名义去展开追求
代理模式架构:
package org.zangyu.Agency;
public class Agency30 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Proxy proxy =new Proxy();//代理人
proxy.Request();//发送请求
}
}
abstract class Subject
{
public abstract void Request();
}
class Proxy extends Subject
{//代理者
RealSubject real;
@Override
public void Request() {
// TODO Auto-generated method stub
if(real==null)//初始化代理人
{
real= new RealSubject();
}
real.Request();//按照代理人发送请求
}
}
class RealSubject extends Subject
{
@Override
public void Request() {
// TODO Auto-generated method stub
System.out.println("真实请求");
}
}
**``应用场合:**
1、远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。(找代理,代理人)
2、虚拟代理,是根据需要创建开销很大的对象。通过他来存放实例化需要很长时间的真实对象。
3、安全代理,用来控制真实对象访问时的权限。
4、智能引导,是指当调用真实的对象时,代理处理另外一些事。
代理模式其实就是在访问对象时引入一定程度的间接性,借此附加多种功能。