【设计模式八之静态代理模式】静态代理模式详解

细说代理模式

提示:
博主:章飞 _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();
	}
}

静态代理模式相对来说比较简单,现实生活场景中也有很多场景案例。所以也不过多的赘述,案例也简单的一批。在代码里面加上之后,会让代码稍微好看点撒。




欢迎继续访问,我的博客

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值