您的位置:首页 > 编程语言 > Java开发

JAVA代理模式Proxy Pattern

2015-09-29 10:45 513 查看
代理模式的定义:对其他对象提供一种代理以控制对这个对象的访问。

代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

代理模式的思想是为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象。这些额外的操作通常需要与实际对象进行通信。

模式结构:一个是真正的你要访问的对象(目标类),一个是代理对象,真正对象与代理,对象实现同一个接口,先访问代理类再访问真正要访问的对象



组成:

抽象角色:通过接口或抽象类声明真实角色实现的业务方法。

代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。

真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
下面通过《看小说学习设计模式》里代理模式例子解说,自己觉得讲的不错,容易理解。

应用场景举例:

比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理,表现在程序上时是这样的体现的

先说说这个场景中的要素:一种类型的女人,潘金莲,王婆,西门庆,后来扩展的贾氏也和西门庆勾上了,我们是假设的,然后西门庆找潘金莲happy,但潘金莲不好意思直接,就找个王婆代理呗。我们看看具体代码。

先定义一种女人

package com.example.pattern;
/**
*
* @author kakaxi
*定义一种类型的女人,王婆和潘金莲都属于这个类型的女人
*/
public interface KindWoman {
//这种女人能做什么事情呢?
public void makeEyesToMan();//抛媚眼
public void happyWithMan();//和男人那个....
}


一种类型嘛,那肯定是接口,然后定义个潘金莲

package com.example.pattern;
/**
*
* @author kakaxi
*定义一个潘金莲是什么样的人
*/
public class PanJinLian implements KindWoman{

@Override
public void makeEyesToMan() {
// TODO Auto-generated method stub
System.out.println("潘金莲抛媚眼...");
}

@Override
public void happyWithMan() {
// TODO Auto-generated method stub
System.out.println("潘金莲和男人在做那个...");
}

}
再定义个丑陋的王婆

package com.example.pattern;
/**
*
* @author kakaxi
*王婆这个人老聪明了,她太老了,是个男人都看不上她,
*但是她有智慧经验呀,他作为一类女人的代理!
*/
public class WangPo implements KindWoman{

private KindWoman kindWom;

public WangPo() {
// TODO Auto-generated constructor stub
this.kindWom=new PanJinLian();//默认的话是潘金莲的代理
}
//她可以是KindWomam的任何一个女人的代理,只要你是这一类型
public WangPo(KindWoman allWoman){
this.kindWom=allWoman;
}
@Override
public void makeEyesToMan() {
// TODO Auto-generated method stub
//王婆年纪大了,谁看她抛媚眼啊
kindWom.makeEyesToMan();
}

@Override
public void happyWithMan() {
// TODO Auto-generated method stub
//自己老了,干不了了,但可以叫年轻的代替。
kindWom.happyWithMan();
}

}
两个女主角都上场了,该男主角了,定义个西门庆

package com.example.pattern;
/**
*
* @author kakaxi
*水浒传是这样写的:西门庆被潘金莲用竹竿敲了一下,西门庆看痴迷了,被王婆看到了,就开始撮合两人好事,王婆作为潘金莲的代理人收了不少好处费,那我们假设一下:
*如果没有王婆在中间牵线,这两个不要脸的能成事吗?难说得很!
*/
public class XiMenQiang {

public static void main(String[] args) {
System.out.println("------西门庆和潘金莲...-------");
//把王婆叫出来
WangPo wangPo=new WangPo();
//然后西门庆说,我要和潘金莲Happy,然后王婆就安排了西门庆丢筷子哪出戏:
wangPo.makeEyesToMan();
//看到没有表面是王婆在做,其实爽的是潘金莲
wangPo.happyWithMan();

}
}
运行结果:



那这就是活生生的一个例子,通过代理人实现了某种目的,如果真去了王婆这个中间环节,直接西门庆和潘金莲勾搭,估计很难成就武松杀嫂事件。 那我们再考虑一下,水浒里面还有没有这类型的女人?有,卢俊义的老婆贾氏(就是和那个管家苟合的那个),这个名字起的:“贾氏”,那我们也让王婆做她的代理:
package com.example.pattern;
/**
* 定义一个贾氏是什么样的人
* @author kakaxi
*
*/
public class JiaShi implements KindWoman{

@Override
public void makeEyesToMan() {
// TODO Auto-generated method stub
System.out.println("贾氏抛媚眼...");
}

@Override
public void happyWithMan() {
// TODO Auto-generated method stub
System.out.println("贾氏和男人在做那个...");
}

}
西门庆勾潘金莲又勾引贾氏

package com.example.pattern;
/**
*
* @author kakaxi
*水浒传是这样写的:西门庆被潘金莲用竹竿敲了一下,西门庆看痴迷了,被王婆看到了,就开始撮合两人好事,王婆作为潘金莲的代理人收了不少好处费,那我们假设一下:
*如果没有王婆在中间牵线,这两个不要脸的能成事吗?难说得很!
*/
public class XiMenQiang {

public static void main(String[] args) {
System.out.println("------西门庆和潘金莲...-------");
//把王婆叫出来
WangPo wangPo=new WangPo();
//然后西门庆说,我要和潘金莲Happy,然后王婆就安排了西门庆丢筷子哪出戏:
wangPo.makeEyesToMan();
//看到没有表面是王婆在做,其实爽的是潘金莲
wangPo.happyWithMan();

System.out.println("------西门庆又和贾氏...-------");

JiaShi jiaShi=new JiaShi();
wangPo =new WangPo(jiaShi);
wangPo.makeEyesToMan();
wangPo.happyWithMan();
}
}
运行结果:



潘金莲和贾氏就是被代理人,王婆就是代理人,王婆负责起中介作用,负责客户与被代理信息交流,真是的执行是潘金莲和贾氏,但是西门庆又不方便直接和被代理人信息交流,此时就需要个代理人。

代理模式主要使用了java的多态,干活的是被代理类,代理类主要是接活,你让我干活,好,我交给幕后的类去干,你满意就成,那怎么知道被代理类能不能干呢?因为都是使用同一个接口,大家知根知底,你能做啥,我能做啥都清楚得很。

现实世界中,明星都会有个经纪人,明星演出通告,那么通有相关会档期安排、宣传、等等相关工作就可以交给经纪人做,明星就只需要到时现在执行就行了,不需要亲自现场安排做那些事。

其实一个是真正的你要访问的对象(目标类),一个是代理对象,真正对象与代理对象实现同一个接口,先访问代理类再访问真正要访问的对象,代理中可以添加方法,或者设置一些限制,来起到了中介的作用和保护了目标对象的作用(上面的例子可不是代理保护被代理)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: