码迷,mamicode.com
首页 > 其他好文 > 详细

代理 模式

时间:2017-12-16 18:36:54      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:创建   ring   访问   before   open   except   方法   调用   img   

概述:

  代理模式:为另一个对象提供一个替身(或占位符),以控制对该对象的访问;
  使用代理模式创建代理对象,让代理对象控制某对象的访问,被代理的对象可以是远程(或创建开销大、需要安全控制的)对象。

要点:

  • 代理角色内部含有对真实角色的引用:从而可以在任何时候操作真实角色对象
  • 代理角色真实角色实现同一接口:以便可以在任何时候都可以替代真实角色,负责在需要的时候创建(删除)真实角色对象。
  • 代理角色通常在将客户端调用传递给真实主题之前(或之后),都要执行某个操作(如检验参数),而非单纯将调用传递给真实角色对象。

一、uml类图

技术分享图片

二、(静态)代理 模式的实现

1,主题角色

技术分享图片
1 package proxy;
2 
3 //主题角色(抽象)
4 public interface Subject {
5   public void request(String param);
6 }
View Code

2,真实角色

技术分享图片
1 package proxy;
2 
3 //真实角色(目标)
4 public class RealSubject implements Subject{
5   @Override
6   public void request(String param) {
7       System.out.println("参数:"+param);
8   }
9 }
View Code

3,代理角色

技术分享图片
 1 package proxy;
 2 
 3 public class StaticProxy implements Subject{
 4     Subject  realSubject;
 5     
 6     public StaticProxy(Subject  realSubject) {
 7         this.realSubject=realSubject;
 8     }
 9   //验证参数(代理对象处理目标对象前)
10     public void before(String param){
11         if(!param.equals("magicalwolf"))
12             throw new IllegalArgumentException();
13     }
14     
15     @Override
16     public void request(String param) {
17         before(param);
18         realSubject.request(param);
19     }
20 }
View Code

4,测试

技术分享图片
 1 package proxy;
 2 
 3 public class Main {
 4     public static void main(String[] args) {
 5         Subject target=new RealSubject();
 6         Subject proxy=new StaticProxy(target);
 7         
 8         proxy.request("magicalwolf");
 9         
10         proxy.request("hello");
11     }
12 }
View Code

 

三、(动态)代理 模式的实现.

1,通过 jdk实现

  JDK提供的动态代理需要实现InvocationHandler接口的invoke方法(此方法为整个代理的入口)。

  方法签名:

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable

  第一个参数proxy:代理对象

  第二个参数目method:目标方法

  第三个参数args:目标方法的参数

  

代理 模式

标签:创建   ring   访问   before   open   except   方法   调用   img   

原文地址:http://www.cnblogs.com/listened/p/8047046.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!