博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式——动态代理前戏——何为静态代理
阅读量:5084 次
发布时间:2019-06-13

本文共 2544 字,大约阅读时间需要 8 分钟。

1:在明白动态代理之前必须明白什么是静态代理?

  静态代理就是在不破坏原来类的包装基础上,为类添加新的功能?如果说一个功能的被不同类利用的多种方式的实现。

比如刚开始想要实现记录demo消耗时间的的方法,我们会这么做:

1 package com.hone.proxy; 2  3 import java.util.Random; 4 //定义一个方法用于计算程序运行,并且休眠一段时间后所需要的时间。 5 public class Tank0 { 6     public static void main(String[] args) { 7         Long start=System.currentTimeMillis(); 8         System.out.println("Tank  moving..........."); 9         10         try {11             Thread.sleep(new Random().nextInt(1000));12         } catch (InterruptedException e) {13             e.printStackTrace();14         }15         Long end=System.currentTimeMillis();16         System.out.println("消耗的时间"+(end-start));17     }18 }

但是假如,我们还有其他的类需要实现这个功能用于计算运行的时间呢,因此是否可以提取出count方法,将count制作成一个接口,让每个类都实现count接口,共享其中的方法。让需要实现的tank,car类都实现Countable接口,实现里面的功能。

1 package com.hone.proxy;2 3 public interface Countable {4     void count();5 }

 

1 package com.hone.proxy; 2 import java.util.Random; 3 //让Tank类实现Countable接口,实现里面的方法 4 public class Tank implements Countable{ 5  6     @Override 7     public void count() { 8         Long start=System.currentTimeMillis(); 9         System.out.println("Tank  moving...........");10         try {11             Thread.sleep(new Random().nextInt(1000));12         } catch (InterruptedException e) {13             e.printStackTrace();14         }15         Long end=System.currentTimeMillis();16         System.out.println("消耗的时间"+(end-start));17     }18 }

 同时car类中也有count()方法,那么就可以用聚合的方式来实现car中的方法,而不需要在重新修改原来Tank的方法,

1 package com.hone.proxy; 2  3 import java.util.Random; 4  5 /* 6  * 利用聚合来处理tank的问题 7  */ 8 public class car implements Countable{
15 Countable t=new Tank();16 17 @Override18 public void count() {19 Long start=System.currentTimeMillis();20 System.out.println("Tank moving...........");21 try {22 Thread.sleep(new Random().nextInt(1000));23 } catch (InterruptedException e) {24 e.printStackTrace();25 }26 Long end=System.currentTimeMillis();27 System.out.println("消耗的时间"+(end-start));28 29 }30 }

 

 

1 package com.hone.proxy;2 3 public class Test {4     public static void main(String args[]){5 6     Countable c=new car();     //这里只需要山里面car就可以了,同时如果类比较多的话,也可用object统一配置7     c.count();8     }9 }

 

这里面car类就完全实现了tank类的方法,这里面extends也可以实现同样的功能,但是extends的可扩展型太差。而且对于大量实现相同功能的类来说,代理+聚合的方法具有重要的意义,避免了一直实例化对象。

但是。。。静态代理本身也有很多弊端,不如这里面无论怎么样都得实例化对象,同时,如果方法改了或者或者说接口改了,是不是又得重新写接口呢?写类的实现呢?

这样会使得代码变得冗杂。

因此,,,下次我们来引入动态处理。

转载于:https://www.cnblogs.com/xiaxj/p/6497564.html

你可能感兴趣的文章
docker入门
查看>>
Android系统--输入系统(十一)Reader线程_简单处理
查看>>
监督学习模型分类 生成模型vs判别模型 概率模型vs非概率模型 参数模型vs非参数模型...
查看>>
Mobiscroll脚本破解,去除Trial和注册时间限制【转】
查看>>
实验五 Java网络编程及安全
查看>>
32位与64位 兼容编程
查看>>
iframe父子页面通信
查看>>
ambari 大数据安装利器
查看>>
java 上传图片压缩图片
查看>>
magento 自定义订单前缀或订单起始编号
查看>>
ACM_拼接数字
查看>>
计算机基础作业1
查看>>
Ubuntu 深度炼丹环境配置
查看>>
C#中集合ArrayList与Hashtable的使用
查看>>
从一个标准 url 里取出文件的扩展名
查看>>
map基本用法
查看>>
poj-1163 动态规划
查看>>
Golang之interface(多态,类型断言)
查看>>
Redis快速入门
查看>>
BootStrap---2.表格和按钮
查看>>