博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式:JDK静态代理之Thread/Runnable
阅读量:4260 次
发布时间:2019-05-26

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

静态代理有如下要素:

1.目标角色(真实角色)。

2.代理角色。

3.目标角色和代理角色实现同一接口。

4.代理角色持有目标角色的引用。

下面的例子是一个简单的静态代理模式。

统一接口:

[java]
  1. package com.xs.pattern.staticproxy;  
  2.   
  3. /** 
  4.  * 统一接口 
  5.  *  
  6.  * @author Administrator 
  7.  *  
  8.  */  
  9. public interface Callable {  
  10.     void call();  
  11. }  

目标角色:

[java]
  1. package com.xs.pattern.staticproxy;  
  2.   
  3. /** 
  4.  * 目标角色 
  5.  *  
  6.  * @author Administrator 
  7.  *  
  8.  */  
  9. public class Target implements Callable {  
  10.   
  11.     public void call() {  
  12.         System.out.println("call...");  
  13.     }  
  14.   
  15. }  
代理角色:
[java]
  1. package com.xs.pattern.staticproxy;  
  2.   
  3. /** 
  4.  * 代理角色 
  5.  *  
  6.  * @author Administrator 
  7.  *  
  8.  */  
  9. public class Proxy implements Callable {  
  10.   
  11.     Callable callable;  
  12.   
  13.     public Proxy(Callable callable) {  
  14.         this.callable = callable;  
  15.     }  
  16.   
  17.     public void call() {  
  18.         System.out.println("before...");  
  19.         callable.call();  
  20.         System.out.println("after...");  
  21.     }  
  22.   
  23. }  
测试:
[java]
  1. package com.xs.pattern.staticproxy;  
  2.   
  3. public class StaticProxyApp {  
  4.     public static void main(String[] args) {  
  5.         Callable target = new Target();  
  6.         Callable proxy = new Proxy(target);  
  7.         proxy.call();  
  8.     }  
  9. }  
输出:
[plain]
  1. before...  
  2. call...  
  3. after...  

JDK中最典型的静态代理就是线程的使用了。
[java]
  1. package com.xs.pattern.staticproxy;  
  2.   
  3. public class ThreadStaticProxy {  
  4.     public static void main(String[] args) {  
  5.         Runnable target = new MyTarget();// 目标角色  
  6.         Thread proxy = new Thread(target);// 代理角色  
  7.         proxy.start();  
  8.     }  
  9. }  
  10.   
  11. class MyTarget implements Runnable {  
  12.   
  13.     public void run() {  
  14.         System.out.println("run...");  
  15.     }  
  16. }  

线程体(也就是我们要执行的具体任务)实现了Runnable接口和run方法。同时Thread类也实现了Runnable接口。此时,线程体就相当于目标角色,Thread就相当于代理角色。当程序调用了Thread的start()方法后,Thread的run()方法会在某个特定的时候被调用。thread.run()方法:

[java]
  1. public void run() {  
  2. (target != null) {  
  3.  target.run();  
  4.   
  5. }  
实际上是执行了线程体的代码。

转载地址:http://tyaei.baihongyu.com/

你可能感兴趣的文章
HDU1074——Doing Homework(状态压缩DP)
查看>>
POJ1113——Wall(凸包)
查看>>
HDU3847——Trash Removal(凸包,枚举)
查看>>
文档滚动对 scrollTop scrollLeft的兼容性封装
查看>>
Python笔记:文档注释docstrings, 让函数更易读懂
查看>>
Python笔记:lambda表达式
查看>>
Python笔记:input
查看>>
Python笔记:错误和异常和访问错误消息
查看>>
Python笔记:对文件的读写操作
查看>>
Python笔记:详解使用Python列表创建ndarray
查看>>
Typescript 中的类的应用
查看>>
Python笔记:NumPy中的布尔型索引使用举例
查看>>
Python笔记:NumPy 中的集合运算举例: 查找共同元素,差异元素和共有元素
查看>>
Python笔记:访问或修改 Pandas Series 中的元素以及相关运算
查看>>
Python笔记:Pandas DataFrames 的使用
查看>>
Python笔记:在Pandas中处理NaN值
查看>>
Python笔记:初识Matplotlib和Seaborn
查看>>
Typescript 中的接口的实现
查看>>
Typescript中的泛型的使用
查看>>
JavaScript中使用offset时遇到的bug
查看>>