java-设计模式(结构型)-【代理模式】

1.代理模式(ProxyMode)

  定义:外观模式是对类与类之间关系的描述,而代理模式是对原来的方法添加其他的操作

          代理有“网关”的含义,比如用户访问论坛,则要经过代理(网关)授权给你才能访问,即

          游客和注册用户的权限不同。

          比如说你要去买房子,而买房子的过程包括:1.看房->2.谈价->3.签订合约->4.正式入手(买房)->5.入住。

          而代理类就是对步骤4操作添加其他操作,而这些操作都由代理类帮你完成。简化了你的买房过程。

  总结:对于某些“远程”(难以完成的)操作,为了能快速完成,此时可以借助代理类帮我们完成部分操作。

           比如远程访问一张大图时,由于网络原因不知何时回返回过来,可以通过代理类先提前返回一个缩略图

  使用场景:

    (1)远程代理。典型的就是客户端与webservice使用的情况,客户端由于是针对OOP编程,而不是针对webservice中的方法进行编程,

           所以得在客户端模拟一下webservice的环境,用proxy来对webservice进行包装,这样就可以使用proxy代理类来远程操作webservice了。

    (2)虚拟代理。比如你要开发一个大文档查看软件,大文档中有大的图片,有可能一个图片有100MB,在打开文件时不可能将所有的图片都显示出来,

           这样就可以使用代理模式,当需要查看图片时,用proxy来进行大图片的打开。

    (3)安全代理。其实也就是本例中所举的买车的例子,金钱不够不可以买车!

    (4)智能指引。比如在访问一个对象时检测其是否被锁定等情况。

              对已有的方法进行改进,此时有两种办法:

                1、修改原有的方法来适应。这样违反了“对扩展开放,对修改关闭”的原则。

                2、就是采用一个代理类调用原有的方法,且对产生的结果进行控制。这种方法就是代理模式。

                     使用代理模式,可以将功能划分的更加清晰,有助于后期维护!

2.图解

  2.1 共同的接口方法

//买车接口
public interface BuyCar {
      //买车的行为
	   void buyCar();
}

 2.2 实现接口的人类

//人类:具有现金,名字属性,具有买车行为的接口。
public class People implements BuyCar {
    
	private int cash;
	private String username;
	//买车行为
	@Override
	public void buyCar() {
		// TODO Auto-generated method stub
		System.out.println(this.username+"买了一辆小车");
	}
	public int getCash() {
		return cash;
	}
	public void setCash(int cash) {
		this.cash = cash;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
}

  2.3 实现接口的代理类

//安全代理类
//人买车代理类:具有“人”成员,具有买房接口的方法
public class ProxyPeople implements BuyCar {
    
	private People p=null;
	private String proxyname=null;
	public ProxyPeople(String proxyname)
	{
		this.proxyname=proxyname;
	}
    //对于人买车的行为进行安全代理
	@Override
	public void buyCar() {
		if(p==null)
		{
			System.out.println("没人来买车,"+this.proxyname+"继续等待客户光临");
			return ;
		}
		System.out.println(proxyname+"在陪"+p.getUsername()+"客户买车。。。");
		//符合条件则可以买车。
		if(p.getCash()>10000)
		{
			//代理之前的操作。。。
			System.out.println(this.proxyname+":"+p.getUsername()+"有"+p.getCash()+"元,你可以买10000以上的小车");
			p.buyCar();
			//代理之后的操作。。。
			System.out.println(this.proxyname+"成功代理"+p.getUsername()+"买了一辆车");
		}
		else
			System.out.println(this.proxyname+":"+p.getUsername()+"有"+p.getCash()+"元,低于10000,无法买车");
	}
	public People getP() {
		
		return p;
	}
    public void setP(People p) {
    	if(p!=null)
    	System.out.println(p.getUsername()+"先生/女士,来买车了。。。");
    	this.p = p;
	}
}

  2.4 测试

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        People p=new People();
        p.setCash(12000);
        p.setUsername("黄生");
        ProxyPeople proxy=new ProxyPeople("A车代理");
        
        proxy.setP(p);
        proxy.buyCar();
        
        p.setCash(5000);
        proxy.buyCar();
        
        proxy.setP(null);
        proxy.buyCar();
	}
}

  2.5 运行结果

黄生先生/女士,来买车了。。。
A车代理在陪黄生客户买车。。。
A车代理:黄生有12000元,你可以买10000以上的小车
黄生买了一辆小车
A车代理成功代理黄生买了一辆车
A车代理在陪黄生客户买车。。。
A车代理:黄生有5000元,低于10000,无法买车
没人来买车,A车代理继续等待客户光临

  

  

posted @ 2015-04-14 16:01  beyondbycyx  阅读(163)  评论(0编辑  收藏  举报