设计模式
来源:互联网 发布:濒死体验知乎 编辑:程序博客网 时间:2024/06/07 05:23
代理模式的作用是控制和管理访问
先看一段代码:
- package com.test;
- /**
- * 抽象角色
- * @author Administrator
- *
- */
- abstract public class Subject {
- abstract public void request();
- }
- package com.test;
- /**
- * 真实角色
- * @author 阳光小强
- *
- */
- public class RealSubject extends Subject{
- public RealSubject(){
- }
- public void request(){
- System.out.println("From real subject");
- }
- }
- package com.test;
- /**
- * 客户端调用
- * @author 阳光小强
- *
- */
- public class Main {
- public static void main(String[] args) {
- Subject sub = new RealSubject();
- sub.request();
- }
- }
- package com.test;
- /**
- *
- * @author 阳光小强
- *
- */
- public class ProxySubject extends Subject{
- private RealSubject realSubject; //以真实角色作为代理角色的属性
- public ProxySubject(){
- }
- @Override
- public void request() {
- preRequest();
- if(realSubject == null){
- realSubject = new RealSubject();
- }
- realSubject.request();
- postRequest();
- }
- private void preRequest(){
- //something you want to do before requesting
- }
- private void postRequest(){
- //something you want to do after requesting
- }
- }
有时候我们需要代理的对象不确定,所以就需要动态代理,Java中的动态代理模式实现如下:
- package com.test;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- public class DynamicSubject implements InvocationHandler {
- private Object dele;
- public DynamicSubject(Object obj) {
- this.dele = obj;
- }
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- doBefore();
- //在这里完全可以把下面这句注释掉,而做一些其它的事情
- Object result = method.invoke(dele, args);
- after();
- return result;
- }
- private void doBefore() {
- System.out.println("before....");
- }
- private void after() {
- System.out.println("after....");
- }
- }
- package com.test;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Proxy;
- /**
- * 客户端调用
- * @author 阳光小强
- *
- */
- public class Main {
- public static void main(String[] args) throws Exception {
- RealSubject rs = new RealSubject(); //被代理的类
- InvocationHandler ds = new DynamicSubject(rs); //初始化代理类
- Subject subject = (Subject) Proxy.newProxyInstance(rs.getClass().getClassLoader(), rs.getClass().getInterfaces(), ds);
- subject.request();
- }
0 0
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式~~~~~~~~~~
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- .Net Remoting 入门
- myeclipse10+maven3.2.2+tomcat7环境部署
- POJ 1364 差分约束
- tapestry注释介绍Annotations
- iOS 各种控件默认高度
- 设计模式
- 查询数据表中的记录(SELECT)
- QQ、Sina等OAuth2.0接入
- LightRoom导入照片卡死
- 面向对象六大原则(六):开闭原则
- hdu 1028 Ignatius and the Princess III(整数划分)
- 使用 HTML5 canvas 进行 Web 绘图
- Android如何使用Handler
- BOOL、bool的区别 && NULL、0、nullptr的区别