细说代理模式
提示:
博主:章飞 _906285288的博客
博客地址:http://blog.csdn.net/qq_29924041
## 细说代理模式 代理,什么叫代理??现实生活中,很多销售类的公司都是代理销售其他公司的产品,如途虎养车电商类的代理了很多轮胎,如街头的一些车票代售点等等,这些都作为一些代理商而存在。 而官方的代理的定义:代理是指以他人的名义,在授权范围内进行对被代理人直接发生法律效力的法律行为
在java编程的世界中,代理其实也就是代理就是定义一个行为和某类(class)的对象相似,而又潜在地表示了所有继承自该类的对象的东西,我们把这种类的对象叫做代理(surrogate)。
顾明思议:定义了一个抽象类或接口,某一个类作为其代理类,通过对代理类的操作,进而去操作具体的类
代理类场景
场景一:
在设计模式之禅中举了这样一个例子,也就是王婆和潘金莲的故事,定义了潘金莲这一类人,而王婆作为潘金莲的代理,也就是中间的传话人,此时如果想约潘金莲的话,此时,可以通过王婆传话,王婆再将话转给潘金莲,王婆也可以是贾氏的代理,贾氏与潘金莲是一类人,所以在此场景下,王婆是代理类,潘金莲和贾氏都是被代理的具体对象,而抽象出来的是她们这一类不太规矩的人
场景二:
现实生活中的售票点,有些临时的售票点,可以卖火车票,也可以卖汽车票,同样有时候也可以定飞机票,那么这个售票点,则就是火车站,汽车站,甚至是航空公司的代理点。它代理售出不同出行方式的票。售票点是代理类,火车站,汽车站,航空公司是具体的被代理的对象,抽象出来的则是他们都交通种类的一种
场景三:
假设有一个需求,在设计一个通用类型播放器的时候,此时这个播放器的要求是既能调用考拉自己的播放器,也可以调用喜马拉雅的播放器,同样需要支持MediaPlayer,还要支持IJK等等一系列播放器,在此场景下,这个通用的播放器,则可以使用代理形式,每个不同的播放器则为被代理的对象,抽象出来所有的播放器的公共接口进行对接,每个播放器可以单独调用,也可以直接通过一个代理类来进行调用
代理类模式UML图例
从图上可以看到,根据被代理的对象抽象出来公共的接口interface,被代理的对象和代理类都实现interface,因此代理类则具有了被代理对象的公共特性,此时,通过对对代理的相关操作,从而实现对被代理对象的某些行为进行操作
上代码
代码一
定义出一种女人的类型
package com.zzf.designpattern.proxypattern.demo1;
public interface KindWomen {
public void makeEyesWithMan();
public void happyWithMan();
}
潘金莲则是这种女人,因此实现KindWomen
package com.zzf.designpattern.proxypattern.demo1;
public class PanJinLian implements KindWomen{
public void makeEyesWithMan() {
// TODO Auto-generated method stub
System.out.println("PanJinLian makeEyesWithWomen");
}
public void happyWithMan() {
// TODO Auto-generated method stub
System.out.println("PanJinLian happyWithMan");
}
}
贾氏也是这种女人
package com.zzf.designpattern.proxypattern.demo1;
public class JiaShi implements KindWomen{
public void makeEyesWithMan() {
// TODO Auto-generated method stub
System.out.println("JiaShi makeEyesWithMan");
}
public void happyWithMan() {
// TODO Auto-generated method stub
System.out.println("JiaShi happyWithMan");
}
}
王婆是他们的代理,也就是通信兵
package com.zzf.designpattern.proxypattern.demo1;
public class WangPo implements KindWomen{
private KindWomen mKindWomen;
public WangPo(KindWomen mKindWomen){
this.mKindWomen = mKindWomen;
}
public void makeEyesWithMan() {
// TODO Auto-generated method stub
if (mKindWomen != null) {
mKindWomen.makeEyesWithMan();
}
}
public void happyWithMan() {
// TODO Auto-generated method stub
if (mKindWomen != null) {
mKindWomen.happyWithMan();
}
}
}
测试类,通过于王婆交谈,王婆把话传给具体的对象
package com.zzf.designpattern.proxypattern.demo1;
/**
*
* @author zhouzhangfei
*代理模式的讲解,代理模式主要是实际对象有一个代理对象,对代理对象的操作其实也就是对实际对象的一种操作
*/
public class ProxyPatternTest {
public static void main(String[] args) {
WangPo mwWangPo = new WangPo(new PanJinLian());
System.out.println(mwWangPo.toString());
mwWangPo.makeEyesWithMan(); //王婆其实是潘金莲的一个代理,对王婆的操作其实就是对代理的一种操作形式
mwWangPo.happyWithMan();
mwWangPo = new WangPo(new JiaShi());
System.out.println(mwWangPo.toString());
mwWangPo.makeEyesWithMan();
mwWangPo.happyWithMan();
}
}
以上案例来自于设计模式之禅,觉得很形象,所以复写了遍
代码二
所有的卖票的抽象出来的接口,售票,退票,换票
package com.zzf.designpattern.proxypattern.demo2;
public interface IStation {
public void sellTicket();
public void withdrawTicket();
public void changeTicket();
}
汽车站
package com.zzf.designpattern.proxypattern.demo2;
public class CarStation implements IStation{
public void sellTicket() {
// TODO Auto-generated method stub
System.out.println("carStation sell ticket");
}
public void withdrawTicket() {
// TODO Auto-generated method stub
System.out.println("Carstation withdraw ticket");
}
public void changeTicket() {
// TODO Auto-generated method stub
System.out.println("carStation changeticket");
}
}
火车站
package com.zzf.designpattern.proxypattern.demo2;
public class RailwayStation implements IStation{
public void sellTicket() {
// TODO Auto-generated method stub
System.out.println("railway station sell ticket");
}
public void withdrawTicket() {
// TODO Auto-generated method stub
System.out.println("railway station withdraw ticket");
}
public void changeTicket() {
// TODO Auto-generated method stub
System.out.println("railway station changeticket");
}
}
飞机场
package com.zzf.designpattern.proxypattern.demo2;
public class AirPlaneStation implements IStation {
public void sellTicket() {
// TODO Auto-generated method stub
System.out.println("air plane station sell ticket");
}
public void withdrawTicket() {
// TODO Auto-generated method stub
System.out.println("air plane withdraw ticket");
}
public void changeTicket() {
// TODO Auto-generated method stub
System.out.println("air plane change ticket");
}
}
售票代理点
package com.zzf.designpattern.proxypattern.demo2;
public class StationProxy implements IStation{
private IStation mIStation;
public StationProxy(IStation mStation){
this.mIStation = mStation;
}
public StationProxy(){
if (mIStation == null) {
mIStation = new CarStation();
}
}
public void sellTicket() {
// TODO Auto-generated method stub
if (mIStation!= null) {
mIStation.sellTicket();
}
}
public void withdrawTicket() {
// TODO Auto-generated method stub
if (mIStation != null) {
mIStation.withdrawTicket();
}
}
public void changeTicket() {
// TODO Auto-generated method stub
if (mIStation != null) {
mIStation.changeTicket();
}
}
}
具体测试类
package com.zzf.designpattern.proxypattern.demo2;
public class StationProxyTest {
public static void main(String[] args) {
StationProxy mProxy = new StationProxy();
mProxy.sellTicket();
mProxy.changeTicket();
mProxy.withdrawTicket();
mProxy = new StationProxy(new CarStation());
mProxy.sellTicket();
mProxy.changeTicket();
mProxy.withdrawTicket();
mProxy = new StationProxy(new AirPlaneStation());
mProxy.sellTicket();
mProxy.changeTicket();
mProxy.withdrawTicket();
mProxy = new StationProxy(new RailwayStation());
mProxy.sellTicket();
mProxy.changeTicket();
mProxy.withdrawTicket();
}
}
静态代理模式相对来说比较简单,现实生活场景中也有很多场景案例。所以也不过多的赘述,案例也简单的一批。在代码里面加上之后,会让代码稍微好看点撒。
欢迎继续访问,我的博客