设计模式--【代理模式】

来源:互联网 发布:sql 判断guid为空 编辑:程序博客网 时间:2024/04/28 22:07
代理模式应用场景举例
  比如在玩“极品飞车”这款游戏,如果游戏者手中的金钱达到了一定的数量就可以到车店买一部性能更高的赛车,那么这个卖车的“车店”就是一个典型的“汽车厂家”的“代理”,他为汽车厂家“提供卖车的服务”给有需求的人士。从面向对象的方面考虑,“销售汽车的代理”也是一个对象,那么这个对象也具有一定的状态,在软件项目中这个对象也具有管理财务进销存的基本功能,那么在设计时就要以面向OOP编程的思想来考虑软件的类结构,这个销售汽车的代理也是一个类了。
 
  【代理模式解释
  
类型:结构模式
  对一些对象提供代理,以限制那些对象去访问其它对象。

  【代理模式UML图
  

  【代理模式-JAVA代码实现
  新建一个买车的接口:
package buy_car_package;

public interface
 buy_car_package {

    
public void
 buy_car();
}


  新建一个people人类,具有买车的行为,所以实现接口buy_car_package:

package buy_car_imple;

import
 buy_car_package.buy_car_package;

public class people implements
 buy_car_package {

    
private int
 cash;
    
private
 String 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;
    }

    
public void
 buy_car() {
        System.out.println(username 
+ "买了一台新车"
);
    }

}


  people类不能拥有车,必须经过proxy代理类的认证,符合条件之后才可以拥有车辆,新建一个代理,这个代理类来考察当前的people是否有资格进行买车:

package buy_car_imple;

import
 buy_car_package.buy_car_package;

public class proxy_buy_car_imple implements
 buy_car_package {

    
private
 people people;

    
public
 people getPeople() {
        
return
 people;
    }

    
public void
 setPeople(people people) {
        
this.people =
 people;
    }

    
public void
 buy_car() {
        
if (people.getCash() > 3000
) {
            System.out.println(people.getUsername() 
+ "" +
 people.getCash()
                    
+ "块 买了新车 交易结束"
);
        } 
else
 {
            System.out.println(people.getUsername() 
+ "金钱不够,请继续比赛!"
);
        }
    }

}


  最后创建一个客户端,用来模拟买车的行为:

package run_main;

import
 buy_car_imple.people;
import
 buy_car_imple.proxy_buy_car_imple;

public class
 run_main {
    
public static void
 main(String[] args) {
        people people_ref1 
= new
 people();
        people_ref1.setCash(
4000
);
        people_ref1.setUsername(
"高洪岩"
);

        people people_ref2 
= new
 people();
        people_ref2.setCash(
2000
);
        people_ref2.setUsername(
"岩洪高"
);

        proxy_buy_car_imple proxy_buy_car_imple 
= new
 proxy_buy_car_imple();
        proxy_buy_car_imple.setPeople(people_ref1);
        proxy_buy_car_imple.buy_car();

        proxy_buy_car_imple.setPeople(people_ref2);
        proxy_buy_car_imple.buy_car();

    }
}


  程序运行结果如下:

高洪岩花4000块 买了新车 交易结束
岩洪高金钱不够,请继续比赛
!


  这样people就不可能自由的拥有车辆,必须经过proxy的认证之后才可以。
  而代理模式在GOF四人帮的介绍中大体有4种使用情景:
  (1)远程代理。典型的就是客户端与webservice使用的情况,客户端由于是针对OOP编程,而不是针对webservice中的方法进行编程,所以得在客户端模拟一下webservice的环境,用proxy来对webservice进行包装,这样就可以使用proxy代理类来远程操作webservice了。
  (2)虚拟代理。比如你要开发一个大文档查看软件,大文档中有大的图片,有可能一个图片有100MB,在打开文件时不可能将所有的图片都显示出来,这样就可以使用代理模式,当需要查看图片时,用proxy来进行大图片的打开。
  (3)安全代理。其实也就是本例中所举的买车的例子,金钱不够不可以买车!
  (4)智能指引。比如在访问一个对象时检测其是否被锁定等情况。