设计模式(十八)——代理模式

1.描述

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

2.模式的使用

·抽象主题(Subject):抽象主题是一个接口,该接口是对象和他的代理所共用的接口,即是RealSubjectProxy实例所实现的接口。

·实际主题(RealSubject):实际主题是实现抽象主题接口的类。实际主题的实例是代理角色(Proxy)实例所代理的对象。

·代理(Proxy):代理是实现抽象主题接口的类(代理和实际主题实现了相同的接口)。代理含有主题接口声明的变量,该变量用来存放RealSubject的实例引用,这样,代理的实例就可以控制对他所包含的RealSubject的实例访问,即可以控制对他所代理的对象的访问。

3.使用情景

·程序不希望用户直接访问该对象,而是提供一个特殊的对象以控制当前对象的访问。

·如果一个对象(例如很大的图像)需要很长时间才能加载完。

·如果对象位于远程主机,需要为用户提供访问该远程对象的能力。

4.优点

·代理模式可以屏蔽用户真正请求的对象,使用户程序和真正的对象之间解耦。

·使用代理来担当那些创建耗时的对象的替身。

5.UML

没有

6案例

 

 1 package 代理模式;
 2 
 3 public class test1 {
 4 
 5     public static void main(String[] args) {
 6         // TODO Auto-generated method stub
 7 
 8     }
 9 
10 }
11 
12 /*
13  * 抽象主题
14  */
15 interface Geometry{
16     public double getArea();
17 }
18 
19 /*
20  * 具体模板
21  */
22 class Triangle implements Geometry{
23     double sideA, sideB, sideC;
24     Triangle(double sideA, double sideB, double sideC){
25         this.sideA = sideA;
26         this.sideB = sideB;
27         this.sideC = sideC;
28     }
29     public double getArea() {
30         double p = (sideA + sideB+ sideC)/2;
31         return Math.sqrt(p * (p - sideA) * (p - sideB) * (p - sideC));
32     }
33     
34 }
35 
36 /*
37  * 代理
38  */
39 class TriangleProxy implements Geometry{
40     double sideA, sideB, sideC;
41     Triangle triangle;
42     public void setSides(double sideA, double sideB, double sideC){
43         this.sideA = sideA;
44         this.sideB = sideB;
45         this.sideC = sideC;
46     }
47     public double getArea() {
48         if(sideA + sideB  > sideC && sideA +sideC > sideB){
49             triangle = new Triangle(sideA, sideB, sideC);  //让所代理的对象调用getArea()方法
50             return triangle.getArea();
51         }
52         else
53             return -1;
54     }
55     
56 }

 

有空补充自动代理

 

posted @ 2017-10-15 12:24  海森堡不如我侧的准  阅读(199)  评论(0编辑  收藏  举报