设计模式--Proxy(代理模式)

本文深入探讨Java代理模式,包括远程代理和虚拟代理的概念及其实现过程。通过实例展示了如何使用代理模式解决跨域访问问题及资源消耗问题。

http://www.cnblogs.com/itTeacher/archive/2012/12/14/2818572.html

为另一个对象提供一个替身或占位符以控制对这个对象的访问,简而言之就是用一个对象来代表另一个对象。

简单例子:有个接口Italk,people对象实现这个接口的talk()方法,有些想另外加入sing()方法,所以增加代理类talkProxy,实现两个方法.

public interface ITalk
{
    public void talk(String msg);
}
public class People implements ITalk
{
    @Override
    public void talk(final String msg)
    {
        System.out.println(msg);
    }
}
public class TalkProxy implements ITalk
{
    ITalk italk;

    public TalkProxy(final ITalk italk)
    {
        this.italk = italk;
    }

    @Override
    public void talk(final String msg)
    {
        this.italk.talk(msg);
    }

    public void sing(final String songName)
    {
        System.out.println("Song Name:" + songName);
    }
}
public class Client {
	public static void main(final String[] args) {
		final People people = new People();
		people.talk("I can't sing");

		final TalkProxy proxy = new TalkProxy(people);
		proxy.talk("I can talk");
		proxy.sing("I can sing");
	}
}
结果:
I can't sing
I can talk
Song Name:I can sing

常见的代理:
1. 远程代理(Remote Proxy):为一个位于不同的地址空间的对象提供一个本地的代理对象。这个不同的地址空间可以是在同一台主机中,也
可是在另一台主机中,远程代理又叫做大使(Ambassador)。

import java.rmi.Remote;
import java.rmi.RemoteException;
public interface MyRemote extends Remote {
	public String getUserName(String userId) throws RemoteException;
}
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class MyRemoteImp extends UnicastRemoteObject implements MyRemote {
	protected MyRemoteImp() throws RemoteException {

	}

	public String getUserName(String userId) throws RemoteException {
		return userId + "/myName is Cherry";
	}
}
在cmd中输入: javac MyRemote.java javac MyRemoteImp.java 回车

rmic MyRemoteImp 回车

生成类的class文件及MyRemoteImp_Stub.class文件

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;

public class MyRemoteServer {
	public static void main(final String[] args) {
		// YTODO Auto-generated method stub
		MyRemote remote;
		try {
			remote = new MyRemoteImp();
			Naming.rebind("RemoteService", remote);
		} catch (final RemoteException e) {
			// YTODO Auto-generated catch block
			e.printStackTrace();
		} catch (final MalformedURLException e) {
			// YTODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

public class MyRemoteClient {
	public static void main(final String[] args) {
		try {
			final MyRemote service = (MyRemote) Naming.lookup("rmi://127.0.0.1/RemoteService");
			final String name = service.getUserName("my id is 001");
			System.out.println(name);
		} catch (final MalformedURLException e) {
			e.printStackTrace();
		} catch (final RemoteException e) {
			e.printStackTrace();
		} catch (final NotBoundException e) {
			e.printStackTrace();
		}
	}

}

打开cmd窗口输入:

start rmiregistry 回车 

javac MyRemoteServer.java 回车

java MyRemoteServer 回车

另开一cmd窗口:

javac MyRemoteClient.java 回车

java MyRemoteClient 回车

输出结果:my id is 001/myName is Cherry

2. 虚拟代理(Virtual Proxy):根据需要创建开销很大的对象。如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表
示,真实对象只会在需要时才会被真正创建。

public interface Image {
	public void show();
}
public class BigImage implements Image {
	public BigImage() {
		// Thread.sleep(3000);//for simulating to load the big images
		System.out.println("create the big images");
	}

	@Override
	public void show() {
		System.out.println("show the big images");
	}
}
public class ImageProxy implements Image {
	Image image;

	public ImageProxy() {

	}

	public ImageProxy(final Image image) {
		this.image = image;
	}

	@Override
	public void show() {
		if (this.image == null) {
			this.image = new BigImage();
		}
		this.image.show();
	}
}
public class Client {
	public static void main(final String[] args) {
		System.out.println("big image:");
		final Image bigImage = new BigImage();
		bigImage.show();

		System.out.println("image proxy:");
		final Image imageProxy = new ImageProxy();
		imageProxy.show();
	}
}

3. Copy-on-Write代理: 虚拟代理的一种,把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。

4. 保护代理(Protection or Access Proxy):控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。

5. 智能指引(Smart Reference):取代了简单的指针,它在访问对象时执行一些附加操作.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值