来源: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. BaaS服务的定义、发展以及未来

    BaaS(Backend as a Service)是一种新型的云服务,旨在为移动和Web应用提供后端云服务,包括云端数据/文件存储.账户管理.消息推送.社交媒体整合等.BaaS是垂直领域的云服务,随 ...

  2. 解决“iOS 7 app自动更新,无法在app中向用户展示更新内容”问题

    转自cocoachina iOS 7能在后台自动app,这对开发者来说和用户都很方便,但是还是有一些缺点.用户不会知道app本次更新的内容,除非他们上到app的App Store页面去查看.开发者也会 ...

  3. DevExpress XtraTreeList的复选框 禁用

    树的2个事件代码如下,通过节点的tag判断是否禁用节点前的复选框.树的节点加载时设置要禁用的节点tag为-1,不禁用的则设为相关的值 private void treeListPer_CustomDr ...

  4. C#的回调被C++调用

    __stdcall 要加这个 extern "C" __declspec(dllexport) 要用这样的东东 定义 extern "C" __declspec ...

  5. undefined reference to `_imp___ZN8QWebViewC1EP7QWidget'

    add this line to your .pro file: QT += webkitwidgets

  6. BW对应后台表[转]

    数据源对应后台表 (2012-01-04 20:08:57) 转载▼ 标签: 杂谈 分类: SAP MM Data Sources Tables Purchasing 2LIS_02_SCL EKKO ...

  7. java攻城狮之路(Android篇)--与服务器交互

    一.图片查看器和网页源码查看器 在输入地址的是不能输入127.0.0.1 或者是 localhost.ScrollView :可以看成一个滚轴 可以去包裹很多的控件在里面 练习1(图片查看器): pa ...

  8. Table_EXISTS_ACTION=APPEND时导入数据时

    11g对数据泵新增了一些功能.这篇介绍新增的选项DATA_OPTIONS=SKIP_CONSTRAINT_ERRORS. Oracle11g的数据泵新增了一个DATA_OPTIONS选项,目前只有一个 ...

  9. WCF安全3-Transport与Message安全模式

    概述: WCF的安全传输主要涉及认证.消息一致性和机密性三个主题.WCF采用两种不同的机制来解决这三个涉及传输安全的问题,一般将它们成为不同的安全模式,即Transport安全模式和Message安全 ...

  10. google翻译,翻译当前的网页

    网页翻译为德语(Translate Page To German) <a href="javascript: void(window.open('http://translate.go ...