文档章节

Java设计模式 之 代理模式

苏凌志
 苏凌志
发布于 2016/10/19 19:47
字数 573
阅读 22
收藏 0

    一个项目,不可避免地要引入第三方的库,我们通常把第三方的库直接拿来,集成到代码里面。但是悲剧从此也就注定了。随着时间的推移,突然有一天,你可能发现这个库的功能并不能满足你了,于是,你开始找寻有没有更牛一点的库,甚至自己写一个更牛的库。

    现在你找到了更好的库,准备替换原来的;但是你突然发现,有很多地方使用了这个库,你开始find和replace,但是要命的是这个库的使用和以前的库一样,都需要配置一些东西。然后你开始小心翼翼地查看引用的地方,把以前的代码清除,把新的代码加入,大概修改了十几个个地方之后抹了一把汗,程序运行起来:靠,bug。

    代理模式登场 

    代理模式的实现有很多种方式,一千个人心中有一千个哈姆雷特,本文只给出一种方式供大家参考

    代理模式分为静态代理和动态代理

    1,静态代理

    1.1,聚合式静态代理

public interface Manager {
    void doSomething();
}
public class Admin implements Manager{

    @Override
    public void doSomething() {
        System.out.print("admin do something");
    }
}
public class AdminPoly implements Manager{
   private Manager admin;

    public AdminPoly(Admin admin){
        super();
        this.admin=admin;
    }
    @Override
    public void doSomething() {
        admin.doSomething();
    }

    public static void main(String[] args) {
        Admin admin = new Admin();
        Manager m = new AdminPoly(admin);
        m.doSomething();
    }

}

    1.2,继承式静态代理

public class AdminProxy extends Admin{
     @Override
    public void doSomething() {
        super.doSomething();
    }
}

    2,动态代理

public interface Moveable {
    void move()  throws Exception;
}
//2. 真实主题  
public class Car implements Moveable {
    public void move() throws Exception {
        Thread.sleep(new Random().nextInt(1000));
        System.out.println("汽车行驶中…");
    }
}
//3.事务处理器  
public class TimeHandler implements InvocationHandler {
    private Object target;

    public TimeHandler(Object target) {
        super();
        this.target = target;
    }

    /**
     * 参数: 
     *proxy 被代理的对象 
     *method 被代理对象的方法 
     *args 方法的参数 
     * 返回: 
     *Object 方法返回值 
     */
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        long startTime = System.currentTimeMillis();
        System.out.println("汽车开始行驶…");
        method.invoke(target, args);
        long stopTime = System.currentTimeMillis();
        System.out.println("汽车结束行驶…汽车行驶时间:" + (stopTime - startTime) + "毫秒!");
        return null;
    }

}
//测试类  
public class Test {
    public static void main(String[] args) throws Exception{
        Car car = new Car();
        InvocationHandler h = new TimeHandler(car);
        Class<?> cls = car.getClass();
        /**
         *loader 类加载器 
         *interfaces 实现接口 
         *h InvocationHandler 
         */
        Moveable m = (Moveable) Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(), h);
        m.move();
    }
}

© 著作权归作者所有

苏凌志
粉丝 0
博文 12
码字总数 21517
作品 0
杭州
Android工程师
私信 提问
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
296
0
设计模式15——Template Method设计模式

Template Method模板方法设计模式定义一个操作中算法的骨架,将具体步骤的执行延迟到子类中实现。Java中的抽象类就是使用了模板方法设计模式。模板方法设计模式结构如下: 以文档处理为例,T...

小米米儿小
2014/01/24
221
0
简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

转载:原地址http://www.cnblogs.com/zhangchenliang/p/3700820.html 简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别 结合简单示例和UML图,讲解工厂模式简单原理。 一、引子 话说...

法斗斗
2018/05/08
279
0
策略模式与SPI机制,到底有什么不同?

这里说的策略模式是一种设计模式,经常用于有多种分支情况的程序设计中。例如我们去掉水果皮,一般来说对于不同的水果,会有不同的拨皮方式。此时用程序语言来表示是这样的: 如上面代码所写...

陈树义
2018/09/03
0
0
学了那么多年设计模式依然不会用!那可真蠢!

什么是设计模式? 设计模式(Design Pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决...

GitChat技术杂谈
2018/10/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
今天
5
0
学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
今天
8
0
VMware vSphere的两种RDM磁盘

在VMware vSphere vCenter中创建虚拟机时,可以添加一种叫RDM的磁盘。 RDM - Raw Device Mapping,原始设备映射,那么,RDM磁盘是不是就可以称作为“原始设备映射磁盘”呢?这也是一种可以热...

大别阿郎
今天
12
0
【AngularJS学习笔记】02 小杂烩及学习总结

本文转载于:专业的前端网站☞【AngularJS学习笔记】02 小杂烩及学习总结 表格示例 <div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng-repeat="x in names | orderBy ......

前端老手
昨天
16
0
Linux 内核的五大创新

在科技行业,创新这个词几乎和革命一样到处泛滥,所以很难将那些夸张的东西与真正令人振奋的东西区分开来。Linux内核被称为创新,但它又被称为现代计算中最大的奇迹,一个微观世界中的庞然大...

阮鹏
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部