首页 > 代码库 > 大话设计模式_代理模式(Java代码)

大话设计模式_代理模式(Java代码)

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

简单描述:1个父类A(或者接口),1个具体执行动作的子类,1个代理类,代理类持有具体子类的引用,在方法中调用具体子类的对象方法。客户端只与代理类交互

大话设计模式中的截图:

例子代码:

Subject类:

 1 package com.longsheng.proxy;
 2 
 3 public interface IGiveGifts {
 4 
 5     public void giveDolls();
 6     
 7     public void giveFlowers();
 8     
 9     public void giveChocolate();
10     
11 }
IGiveGifts

RealSubject类:

 1 package com.longsheng.proxy;
 2 
 3 public class Pursuit implements IGiveGifts {
 4 
 5     SchoolGirl sg;
 6 
 7     public Pursuit(SchoolGirl sg) {
 8         this.sg = sg;
 9     }
10 
11     @Override
12     public void giveDolls() {
13         System.out.println(sg.getName() + ", 送你玩具");
14     }
15 
16     @Override
17     public void giveFlowers() {
18         System.out.println(sg.getName() + ", 送你鲜花");
19     }
20 
21     @Override
22     public void giveChocolate() {
23         System.out.println(sg.getName() + ", 送你巧克力");
24     }
25 
26 }
Pursuit

Proxy类:

 1 package com.longsheng.proxy;
 2 
 3 public class Proxy implements IGiveGifts {
 4 
 5     private Pursuit p;
 6 
 7     public Pursuit getP() {
 8         return p;
 9     }
10 
11     public void setP(Pursuit p) {
12         this.p = p;
13     }
14 
15     public Proxy(SchoolGirl sg) {
16         this.p = new Pursuit(sg);
17     }
18 
19     @Override
20     public void giveDolls() {
21         if( p != null ) {
22             p.giveDolls();
23         }
24     }
25 
26     @Override
27     public void giveFlowers() {
28         if( p != null ) {
29             p.giveFlowers();
30         }
31     }
32 
33     @Override
34     public void giveChocolate() {
35         if( p != null ) {
36             p.giveChocolate();
37         }
38     }
39 
40 }
Proxy

其他类:

 1 package com.longsheng.proxy;
 2 
 3 public class SchoolGirl {
 4 
 5     private String name;
 6 
 7     public String getName() {
 8         return name;
 9     }
10 
11     public void setName(String name) {
12         this.name = name;
13     }
14     
15 }
SchoolGirl

客户端:

 1 package com.longsheng.proxy;
 2 
 3 public class Client {
 4 
 5     public static void main(String[] args) {
 6         SchoolGirl sg = new SchoolGirl();
 7         sg.setName("李娇娇");
 8         Proxy p = new Proxy(sg);
 9         p.giveDolls();
10         p.giveFlowers();
11         p.giveChocolate();
12     }
13 
14 }
Client

 

代理模式的使用场景

(1)远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实
(2)虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象(例如浏览器下载图片的问题)
(3)安全代理,用来控制真实对象访问时的权限,一般用于对象应该具有不同的访问权限的时候
(4)智能指引,是指当调用真实的对象时,代理处理另外一些事情(如计算真实对象的引用次数,如果没有引用了,可以释放对象)