【设计模式】代理模式详解

前言

博主只是一名大三学生,文章内容难免有不足之处,欢迎批评指正。

正文

转载请注明出处: http://blog.csdn.net/h28496/article/details/46707621

发 表 时 间: 2015年7月1日

什么是代理模式?

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

代理模式常被分为远程代理、虚拟代理、保护代理等等。

代理模式的结构

UML类图

角色介绍

① 抽象接口:被代理类和代理类都需要实现的接口,定义了某个/些功能;

② 被代理类:定义了被代理的对象;

③ 代理类:代理对象内部含有一个被代理的对象,从而可以在内部操作目标对象。代理类实现了一个和被代理类相同的接口,以便可以在任何时候替代目标对象。

代理模式初步实现

假设场景:

老师给了女生50KG的东西,需要搬进宿舍楼,但是她们力量有限,一次只能搬25KG。

因此我们需要给女生设置一个代理,即男生。

老师把东西给男生,男生分次给女生25KG的东西搬,直到搬完。

(男生不能进女生寝室……不能直接帮她们搬。)

题目分析:

首先我们需要一个接口,该接口有一个方法carray(int weight),实现搬东西的功能。

然后我们要有一个女生类Girl,作为被代理类。

其次还要有一个男生类Boy,作为代理类。

最后还要有个客户端类。

ICarry.java

package zhp.proxypattern;

/**
 * 搬运东西的接口,供 Boy 类 和 Girl 类实现。
 * @author 郑海鹏
 * @since 2015年6月18日
 */
public interface ICarry {

	public void carry(int weight);

}

Girl.java

package zhp.proxypattern;

/**
 * Girl类,被代理类。
 * @author 郑海鹏
 * @since 2015年6月18日
 */
public class Girl implements ICarry{
	public final static int MAX_WEIGHT = 25;

	@Override
	public synchronized void carry(int weight) {
		// 可以思考一下为什么有这个同步锁

		if(weight > MAX_WEIGHT){
			// 超过25KG,女生搬不动
			System.out.println("我搬不动!!");
			return;
		}

		System.out.println("我把" + weight + "公斤的东西搬完了。");
	}

}

Boy.java

package zhp.proxypattern;

/**
 * 代理类
 * @author 郑海鹏
 * @since 2015年6月18日
 */
public class Boy implements ICarry {
	private Girl girl = new Girl();		// 拥有一个被代理的对象
	private int mWeight = 0;

	@Override
	public void carry(int weight) {
		mWeight += weight;

		while(mWeight > 25){
			girl.carry(25);
			mWeight -= 25;
		}

		if(mWeight != 0){
			girl.carry(mWeight);
		}
	}

}

Client.java

package zhp.proxypattern;

/**
 * 客户端
 * @author 郑海鹏
 * @since 2015年6月18日
 */
public class Client {

	public static void main(String[] args) {
		Girl girl = new Girl();
		pleaseCarry(girl, 50);	// 让女生搬50KG的东西

		System.out.println("---------------------");

		Boy boy = new Boy();
		pleaseCarry(boy, 50);
	}

	public static void pleaseCarry(ICarry carry, int weight){
		carry.carry(weight);
	}

}

执行结果:

在这个例子中,女生类不合适被用到于weight>25的场合中,从而使用代理类Boy进行缓冲,保护了被代理类。

代理模式在Android中的应用

代理模式在Android开发中经常被用到,例如:Android执行某个操作可能会很耗时,因此在主线程中应该避免此类耗时操作。可以使用一个代理类,实现耗时操作的接口,在主线程中交给这个代理类去做,当然代理类会开辟一个子线程。

假设场景:

我们已经有了一个实现IUpload接口的类UploadPic,可以用来上传图片。

但在Android中是不能直接在主线程中要上传图片到服务器的。

当然我们可以新建一个子线程去上传,但代码复用性太低了。如果以后需要修改某个参数,就得去修改每个上传用的子线程。

使用代理模式去处理这个问题就是个不错的选择。更好的是,我们可以在代理时,可以再执行一些其他操作,例如检查网络。

分析问题:

首先得有个接口:IUpload,接口定义上传操作。

还有个被代理类:UploadPic,实现IUpload接口,并提供上传图片的基本功能。

再有一个代理类:Proxy_UploadPic,同样实现IUpload接口,包含一个UploadPic的对象。

IUpload.java

package zhp.pattern.proxypattern;

/**
 * 上传接口。
 * @author 郑海鹏
 * @since 2015年6月18日
 */
public interface IUpload {

	/**
	 * 上传文件
	 * @param path	要上传的文件路径
	 */
	public void upload(String path);

}

UploadPic.java

package zhp.pattern.proxypattern;

/**
 * 上传图片的类。
 * @author 郑海鹏
 * @since 2015年6月18日
 */
public class UploadPic implements IUpload {

	@Override
	public void upload(String path) {
		// 输出:正在上传
		zhp.android.debug.Debug.Log(this.getClass().getName(), "正在上传!");
	}

}

Proxy_UploadPic.java

package zhp.pattern.proxypattern;

import android.content.Context;
import zhp.android.utils.Utils_Network;

/**
 * 代理类,用于在子线程中上传图片
 * @author 郑海鹏
 * @since 2015年6月18日
 */
public class Proxy_UploadPic implements IUpload {
	UploadPic uploadPic;
	Context context;

	public Proxy_UploadPic(Context context) {
		this.context = context;
		this.uploadPic = new UploadPic();
	}

	@Override
	public void upload(final String path) {
		// 先检测网络
		boolean isWifiConned = Utils_Network.getInstance().isWifiConnected(this.context);
		if(!isWifiConned){
			// 没有wifi的话,输出:wifi没有连接,无法上传!
			zhp.android.debug.Debug.Log(this.getClass().getName(), "Wifi没有连接,无法上传!");
			return;
		}

		// 再上传
		new Thread(new Runnable() {
			public void run() {
				uploadPic.upload(path);
			}
		}).start();
	}

}

MainActivity.java

package zhp.pattern.proxypattern;

import android.app.Activity;
import android.os.Bundle;

/**
 * 客户端
 * @author 郑海鹏
 * @since 2015年6月18日
 */
public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		// 使用代理上传,附加网络状态监测
		uploadPicture(new Proxy_UploadPic(this), "sdcard/a.png");
	}

	private void uploadPicture(IUpload upload, String path){
		upload.upload(path);
	}
}

执行结果:

没有wifi

有wifi

通过代理模式我们就能简洁地实现上传功能了,同时附加了其他功能。对以后的修改也变得很方便,只需在代理类中修改即可。

代理模式的优缺点

优点

代理类为被代理的对象增加了一些扩展,在真实目标类上加入一些其它操作,而这些操作的细节都交给代理处理,你只需要集中目标类功能的实现。同时便于以后的修改。

缺点

会有很多代理类,类变多了。

关于代理模式的动态代理,我想和反射放在一起。估计下个星期发出来(^_^)

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 20:41:58

【设计模式】代理模式详解的相关文章

设计模式 - 代理模式(proxy pattern) 未使用代理模式 详解

代理模式(proxy pattern) 未使用代理模式 详解 本文地址: http://blog.csdn.net/caroline_wendy 部分代码参考: http://blog.csdn.net/caroline_wendy/article/details/37698747 如果需要监控(monitor)类的某些状态, 则需要编写一个监控类, 并同过监控类进行监控. 但仅仅局限于本地, 如果需要远程监控, 则需要使用代理模式(proxy pattern). 具体方法: 1. 类中需要提供

java 代理模式详解

java 动态代理(JDK和cglib) 设计模式这东东每次看到就明白可过段时间又不能很流利的说出来,今天就用详细的比喻和实例来加深自己的理解(小弟水平不高有不对的地方希望大家能指出来). (1)代理这个词生活中有很多比如在街边卖手机卡.充公交地铁卡的小商店他们都起了代理的作用,java中的代理跟这些小店商的作用是一样的.再比如我想在淘宝上开个服装店但又没有货源怎么办,这时候我就要跟淘宝上某一卖家联系做他的代理.我跟我的商家都要卖衣服(就好比我们都继承了卖衣服的接口sellClothesInte

Docker Kubernetes Service 网络服务代理模式详解

Docker Kubernetes  Service 网络服务代理模式详解 Service service是实现kubernetes网络通信的一个服务 主要功能:负载均衡.网络规则分布到具体pod 注:kubernetes deployment服务分配服务器负载均衡VIP只能NODE节点单独访问,这里需要外网用户可以放问到容器内,这里就需要用到service. 网络代理模式 kube-proxy v1.0中只支持userspace模式,在v1.1中,添加了iptables代理,在v1.2开始ip

(二) 代理模式详解(包含原理详解)

转载:http://www.cnblogs.com/zuoxiaolong/p/pattern3.html 本章接着讨论第二种要介绍的设计模式,代理模式. LZ不希望写的东西与网络上的资料千篇一律,所以这一系列不会像很多典型文章一章,只是列出这个模式的定义以及一堆适用的情况,然后就是一堆这个模式的各个角色,对于这种罗列LZ并不反对,相比之下会比较清晰,但是如果脱离了实际,就会导致看的人特别是初学者觉得设计模式很陌生很遥远. LZ并不反对这种教学式的标准模式,但说实话,LZ本人看这种帖子从来都感觉

火热的足球广告平台代理模式详解

什么是足球广告平台? 足球广告平台是一款连接广告与受众的新型平台. 以往广告通常需要找到一个拥有大量流量的媒体,一般有报纸.电视台.微博大v.自媒体大v等.这类流量有个共同点,就是广告主出相应费用,让他们一次或者多次发布软文或者硬广,中间或许还要参入一些策划团队来实现文案与活动的策划.这类媒体普遍存在转化率低导致的性价比不高.另一种就是类似百度这类搜索引擎的"按点击付费",这类精准客户多,几乎点击的人都是潜在客户,转化率普遍比较高.所以性价比出众.足球广告在这样的一种排名机制上进化,自

代理模式详解

什么是代理模式 代理模式是对象的结构模式.代理模式为其他对象提供一种代理以控制对这个对象的访问. 简单来说,在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 举个例子 我们打算结婚,但是婚礼的细节我们不想管,这时候我们找到婚庆公司,让他们帮我们包揽婚礼的细节,这就是"代理模式".既然是代理模式,那么就应该有一个代理角色和真实角色.例子中的"我们"就是真实角色,"婚庆公司"就是代理角色. 我

五、代理模式详解

7.代理模式 7.1.课程目标 1.掌握代理模式的应用场景和实现原理. 2.了解静态代理和动态代理的区别. 3.了解CGLib和JDK Proxy的根本区别. 4.手写实现定义的动态代理. 7.2.内容定位 都知道 SpringAOP 是用代理模式实现,到底是怎么实现的?我们来一探究竟,并且自己仿真手写 还原部分细节. 7.3.代理模式定义 代理模式(ProxyPattern)是指为其他对象提供一种代理,以控制对这个对象的访问,属于结构型模式. 在某些情况下,一个对象不适合或者不能直接引用另一个

JS设计模式——工厂模式详解

工厂模式是另外一种关注对象创建概念的创建模式.它的领域中同其它模式的不同之处在于它并没有明确要求我们使用一个构造器.取而代之,一个工厂能提供一个创建对象的公共接口,我们可以在其中指定我们希望被创建的工厂对象的类型. 简单工厂模式:使用一个类(通常为单体)来生成实例 复杂工厂模式:使用子类来决定一个变量成员应该为哪个具体的类的实例. 简单工厂模式 var BicycleShop = function () { }; BicycleShop.prototype = { sellBicycle: fu

设计模式-策略模式详解

一.引言 在讲策略模式之前,我们来看零售行业软件的一个针对客户类型打折的功能. vip客户打八折,svip客户打七折. 代码实现: if (customer == "vip") { amount = amount * 0.8; } else if (customer == "svip") { amount = amount * 0.7; } 看代码,挺简单的,但是如果今天vip打八折,明天要打7折,那还得改变原有的代码,这样就违背了开闭原则.这里变化的是折扣的计算方