来源:http://www.bjsxt.com/ 
一、【GOF23设计模式】_代理模式、静态代理

package com.test.proxy.staticProxy;

public interface Star {
/**
* 面谈
*/
void confer();
/**
* 签合同
*/
void signConstract();
/**
* 订票
*/
void bookTicket();
/**
* 唱歌
*/
void sing();
/**
* 收钱
*/
void collectMoney();
}
 package com.test.proxy.staticProxy;

 public class RealStar implements Star{

     @Override
public void confer() {
System.out.println("RealStar.confer()");
} @Override
public void signConstract() {
System.out.println("RealStar.signConstract()");
} @Override
public void bookTicket() {
System.out.println("RealStar.bookTicket()");
} @Override
public void sing() {
System.out.println("RealStar(歌手本人).sing()");
} @Override
public void collectMoney() {
System.out.println("RealStar.collectMoney()");
}
}
 package com.test.proxy.staticProxy;

 public class ProxyStar implements Star{
private Star realStar; public ProxyStar(Star realStar) {
super();
this.realStar = realStar;
} @Override
public void confer() {
System.out.println("ProxyStar.confer()");
} @Override
public void signConstract() {
System.out.println("ProxyStar.signConstract()");
} @Override
public void bookTicket() {
System.out.println("ProxyStar.bookTicket()");
} @Override
public void sing() {
realStar.sing();
} @Override
public void collectMoney() {
System.out.println("ProxyStar.collectMoney()");
}
}
 package com.test.proxy.staticProxy;

 public class Client {
public static void main(String[] args) {
Star realStar = new RealStar();
Star proxyStar = new ProxyStar(realStar); proxyStar.confer();
proxyStar.signConstract();
proxyStar.bookTicket();
proxyStar.sing();
proxyStar.collectMoney();
}
}
控制台输出:
ProxyStar.confer()
ProxyStar.signConstract()
ProxyStar.bookTicket()
RealStar(歌手本人).sing()
ProxyStar.collectMoney()

二、【GOF23设计模式】_代理模式、动态代理、开发中常见的场景

动态代理(动态生成代理类)
——JDK自带的动态代理
——javaassist字节码操作库实现
——CGLIB
——ASM(底层使用指令,可维护性较差) 动态代理相比于静态代理的优点
——抽象角色中(接口)声明的所有方法都被转移到调用处理器中一个集中的方法中处理,这样我们可以更加灵活和统一地处理众多的方法。
JDK自带的动态代理
——java.lang.reflect.Proxy
————作用:动态生成代理类和对象
——java.lang.reflect.InvocationHandler(处理器接口)
————可以通过invoke方法实现对真实角色的代理访问
————每次通过Proxy生成代理类对象时都要指定对应的处理器对象
Star realStar = new RealStar();
StarHandler handler = new StarHandler(realStar);
Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class}, handler);
proxy.sing();
 package com.test.proxy.dynamicProxy;

 public interface Star {
/**
* 面谈
*/
void confer();
/**
* 签合同
*/
void signConstract();
/**
* 订票
*/
void bookTicket();
/**
* 唱歌
*/
void sing();
/**
* 收钱
*/
void collectMoney();
}
 package com.test.proxy.dynamicProxy;

 public class RealStar implements Star{

     @Override
public void confer() {
System.out.println("RealStar.confer()");
} @Override
public void signConstract() {
System.out.println("RealStar.signConstract()");
} @Override
public void bookTicket() {
System.out.println("RealStar.bookTicket()");
} @Override
public void sing() {
System.out.println("RealStar(歌手本人).sing()");
} @Override
public void collectMoney() {
System.out.println("RealStar.collectMoney()");
}
}
 package com.test.proxy.dynamicProxy;

 import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; public class StarHandler implements InvocationHandler{
private Star realStar; public StarHandler(Star realStar) {
super();
this.realStar = realStar;
} @Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable { Object object = null; System.out.println("真正的方法执行前");
System.out.println("面谈,签合同,预付款,订机票"); if(method.getName().equals("sing")){
object = method.invoke(realStar, args);
} System.out.println("真正的方法执行后");
System.out.println("收尾款"); return object;
}
}
 package com.test.proxy.dynamicProxy;

 import java.lang.reflect.Proxy;

 public class Client {
public static void main(String[] args) {
Star realStar = new RealStar();
StarHandler handler = new StarHandler(realStar); Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class}, handler); proxy.sing();
}
}
控制台输出:
真正的方法执行前
面谈,签合同,预付款,订机票
RealStar(歌手本人).sing()
真正的方法执行后
收尾款
 

【GOF23设计模式】代理模式的更多相关文章

  1. 9. 星际争霸之php设计模式--代理模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  2. C++设计模式——代理模式

    前言 青春总是那样,逝去了才开始回味:大学生活也是在不经意间就溜走了,现在上班的时候,偶尔还会怀念大学时,大家在一起玩游戏的时光.大学喜欢玩游戏,但是可悲的校园网,速度能把人逼疯了:还好,后来搞了一个 ...

  3. PHP设计模式-代理模式

    概念理解: 代理模式,是对简单处理程序(或指针)的增强,用于引用一个对象:这个指针被代理对象取代,代理对象位于客户端和真实程序之间,指针有一个可被多个目标利用的钩子. 参与者: client(参与者) ...

  4. Java设计模式-代理模式之动态代理(附源代码分析)

    Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...

  5. 浅谈Python设计模式 - 代理模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 一.在某些应用中,我们想要在访问某个对象之前执行一个或者多个重要的操作,例如,访 ...

  6. Java 之 设计模式——代理模式

    设计模式——代理模式 一.概述 1.代理模式 (1)真实对象:被代理的对象 (2)代理对象:代理真实对象的 (3)代理模式:代理对象代理真实对象,达到增强真实对象功能的目的 二.实现方式 1.静态代理 ...

  7. [Head First设计模式]抢票中的设计模式——代理模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  8. JAVA 设计模式 代理模式

    用途 代理模式 (Proxy) 为其他对象提供一种代理以控制对这个对象的访问. 代理模式是一种结构型模式. 结构

  9. Java设计模式 - 代理模式

    1.什么是代理模式: 为另一个对象提供一个替身或占位符以访问这个对象. 2.代理模式有什么好处: (1)延迟加载 当你需要从网络上面查看一张很大的图片时,你可以使用代理模式先查看它的缩略图看是否是自己 ...

  10. 深入浅出设计模式——代理模式(Proxy Pattern)

    模式动机在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用.代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到 ...

随机推荐

  1. 深入浅出 nginx lua 为什么高性能

    最近很多人问我nginx lua的优势是什么?为什么? 一.同步和异步.阻塞和非阻塞 如果要说清楚这个问题首先要了解:同步和异步.阻塞和非阻塞的关系 同步:php.java的正常代码都是同步执行的 异 ...

  2. 【redmine】密码忘了后重新设置

    有段时间没有使用,忘记了原来的密码,搜索网上有一篇文章,不过版本比较老,和现在文件位置不一样,参考后成功重置了密码,感谢原作者. 原文内第一步一般是不需要的.主要是用ruby命令修改数据库内容. 进入 ...

  3. ASP - MSXML2.ServerXMLHTTP & HTTPS & 证书过期 — msxml3.dll '80072f05'

    Error: msxml3.dll  '80072f05' The date in the certificate is invalid or has expired Dim xmlhttp Set ...

  4. ExtJs TreePanel 使用帮助

    tree :树 node:节点 1.全部展开 tree.expandAll(); 2.全部收缩 tree.collapseAll(); 3.得到父节点 node.parentNode 4.判断是否有父 ...

  5. Scene视图辅助线绘制

    有时候需要在Scene视图中绘制一些辅助线,方便进行一些编辑的工作,可以通过如下类和函数完成: 绘制辅助线,相关类: Gizmos类:用于在Scene视图中绘制调试信息或辅助线,这些辅助线只有在Sce ...

  6. multi-CPU, multi-core and hyper-thread--转

    原文地址:http://stackoverflow.com/questions/680684/multi-cpu-multi-core-and-hyper-thread Multi-CPU was t ...

  7. SQL Server中的事务日志管理(6/9):大容量日志恢复模式里的日志管理

    当一切正常时,没有必要特别留意什么是事务日志,它是如何工作的.你只要确保每个数据库都有正确的备份.当出现问题时,事务日志的理解对于采取修正操作是重要的,尤其在需要紧急恢复数据库到指定点时.这系列文章会 ...

  8. SQL Server里PIVOT运算符的”红颜祸水“

    在今天的文章里我想讨论下SQL Server里一个特别的T-SQL语言结构——自SQL Server 2005引入的PIVOT运算符.我经常引用这个与语言结构是SQL Server里最危险的一个——很 ...

  9. IOS开发中设置控件内容对齐方式时容易混淆的几个属性

    IOS开发中四个容易混淆的属性: 1. textAligment : 文字的水平方向的对齐方式 1> 取值 NSTextAlignmentLeft      = 0,    // 左对齐 NST ...

  10. sprint2 项目部署+展示

    项目展示网址: http://160q49b998.51mypc.cn/ (注:所有用户密码都为123456,校内断网时访问不了)