Java设计模式11:常用设计模式之代理模式(结构型模式)

1. Java之代理模式(Proxy Pattern)

(1)概述:

代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。

在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

2. 应用场景:

(1)简介:

      例如:假设有一组对象都实现同一个接口,实现同样的方法,但这组对象中有一部分对象需要有单独的方法,传统的笨办法是在每一个应用端都加上这个单独的方法,但是代码重用性低,耦合性高。
如果用代理的方法则很好的解决了这个问题。
 
      比如在玩“极品飞车”这款游戏,如果游戏者手中的金钱达到了一定的数量就可以到车店买一部性能更高的赛车,那么这个卖车的“车店”就是一个典型的“汽车厂家”的“代理”,他为汽车厂家“提供卖车的服务”给有需求的人士。从面向对象的方面考虑,“销售汽车的代理”也是一个对象,那么这个对象也具有一定的状态,在软件项目中这个对象也具有管理财务进销存的基本功能,那么在设计时就要以面向OOP编程的思想来考虑软件的类结构,这个销售汽车的代理也是一个类了。
 
(2)代理模式UML图:
 
 

 • 抽象对象角色:声明真实对象和代理对象的共同接口。

 • 代理对象角色代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能够代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。

 • 真实对象角色代理角色所代表的真实对象,是我们最终要引用的对象。

2. 应用场景代码:

(1)定义一个抽象对象角色,定义公共接口buy_car,如下:

1 /**
2 *
3 *抽象对象角色(公共接口)
4 */
5 public interface buy_car {  
6   public void buy_mycar();  
7 } 

(2)定义一个真实对象角色,这个真实对象角色实现了上面的公共接口,如下:

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

 1 /**
 2 *真实对象角色,它实现公共接口
 3 */
 4 class people implements buy_car {
 5  
 6    private int cash;
 7    private String vip;
 8    private String username;
 9   
10  @Override
11  public void buy_mycar() {
12   // TODO Auto-generated method stub
13   System.out.print(username+"是vip 客户,可以直接购买新车!");
14  }
15 
16 public int getCash(){
17       return cash;
18    }
19    public void setCash(int cash){
20        this.cash = cash;
21     }
22    public String getUsername(){
23        return username;
24     }
25    public void setUsername(String username){
26        this.username = username;
27     }
28    public String getVip(){
29        return vip;
30     }
31    public void setVip(String vip){
32         this.vip = vip;
33    }
34 }

(3)定义一个代理对象角色,如下:

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

 1 /**
 2 *代理对象角色
 3 */
 4 class proxyclass implements buy_car {
 5    
 6     private people people;
 7     public people getPeople(){
 8      return people;
 9     }
10     public void setPeople(people people){
11      this.people = people;
12     }
13     
14  @Override
15  public void buy_mycar() {
16   // TODO Auto-generated method stub
17   
18   if (people.getVip() == "vip"){
19       people.buy_mycar();
20       return ;
21      } 
22     if(people.getCash()>=50000){
23      System.out.println(people.getUsername()+"买了新车,交易结束!");
24     }
25     else
26     {
27      System.out.println(people.getUsername()+"钱不够,不能买车,继续比赛!");
28     }
29  }
30 }

(4)最后一个客户端测试类,如下:

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

 1 public class run_main {
 2 
 3 
 4  public static void main(String[] args) {
 5   // TODO Auto-generated method stub
 6       people people_1 =new people();
 7       people_1.setCash(60000);
 8       people_1.setUsername("jeck");
 9 
10 
11       people people_2 =new people();
12       people_2.setCash(40000);
13       people_2.setUsername("rose");
14      
15       people people_3 =new people();
16 
17       people_3.setCash(0);
18       people_3.setUsername("tom");
19       people_3.setVip("vip");
20      
21       proxyclass proxy_buy = new proxyclass();
22       proxy_buy.setPeople(people_1);
23       proxy_buy.buy_mycar();
24      
25       proxy_buy.setPeople(people_2);
26       proxy_buy.buy_mycar();
27      
28       proxy_buy.setPeople(people_3);
29       proxy_buy.buy_mycar();
30            
31  }
32 
33 }

程序运行结果如下:

1  jeck买了新车,交易结束!
2  rose钱不够,不能买车,继续比赛!
3  tom是vip 客户,可以直接购买新车!

代理模式主要使用了java的多态,干活的是被代理类,代理类主要是接活,你让我干活,好,我交给幕后的类去干,你满意就成,那怎么知道被代理类能不能干呢?同根就成,大家知根知底,你能做啥,我能做啥都清楚得很,同样一个接口。

原文地址:https://www.cnblogs.com/hebao0514/p/4920782.html