博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java学习——多线程之静态代理模式
阅读量:3940 次
发布时间:2019-05-24

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

Java学习——多线程之静态代理模式

我们在学习Java时知道23种设计模式是前人总结出来的比较好的模式,以供后人使用,那么23种设计模式到底是哪23种呢?主要分为3大类,如下:

1.创建型模式(共五种):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

2.结构型模式(共七种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
3.行为型模式(共十一种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

那么今天我们就来学习代理模式里面的一种静态代理模式,有静态代理当然就有动态代理,今天我们就先来看静态代理,因为在多线程种我们需要了解到静态代理模式。

我们设想一个场景:比如说你要结婚了,那是不是要请一个婚庆公司。因为结婚这事你需要亲力亲为,但是像布置结婚现场、活跃结婚气氛、主持结婚流程、包括善后工作,作为结婚的你当然是忙的不可开交,自然不能去做这些事情了,那么你是不是就请了一个婚庆公司,让婚庆公司帮你去做这些事,代替你去做结婚的这些事情,虽然你和婚庆公司都要去做结婚这件事情,但是其实本质上来说结婚的还是你自己。下面我们来看下用代码怎么去实现:

/** * 静态代理模式: *              1.真实角色 *              2.代理角色 *              3.共同要实现的接口 *     注意: *          代理对象代理真实角色去结婚,真实结婚的还是真实对象。 *     优点: *          代理对象可以做很多真实对象做不了的事情,真实对象专心的去做自己的事情 */public class StaticProxy {    public static void main(String[] args) {        //结婚,让代理帮你,至于要将你作为对象交给代理对象,它就可以帮你完成结婚        //获取真实角色        You you = new You();        //获取代理角色,并将真实角色传给代理角色        WeddingCompany weddingCompany = new WeddingCompany(you);        //代理觉得帮你去结婚,实际上还是你自己去结婚的,不过结婚所附带的是就不用你去做了,你只需要专注结婚,其他的事情代理帮你做好        weddingCompany.happyMarry();    }}//你class You implements Marry{    @Override    public void happyMarry() {        System.out.println("你要结婚了");    }}//你的代理对象:婚庆公司class WeddingCompany implements Marry{    private You you;    public WeddingCompany(You you) {        this.you = you;    }    @Override    public void happyMarry() {        //结婚之前代理帮真实角色做的事        System.out.println("结婚之前,布置现场");        //真实角色只用专注于结婚就行了        you.happyMarry();        //结婚之后代理帮真实角色做的事        System.out.println("结婚之后,惨不忍睹");    }}//你们都要做的事(接口):结婚interface Marry{    void happyMarry();}

我们看见这个代码是不是与我们多线程种实现Runnable接口,重写run方法非常的相似呢,我们再来回顾一下第二种线程的实现方式:

/** * 创建线程方式二: *          1.实现Runnable接口 *          2.重写run方法 *          3.借助静态代理模式开启线程 *///1.实现Runnable接口public class TestNewThread02 implements Runnable{    //2.重写run方法    @Override    public void run() {        //这里是线程体        for (int i = 0; i < 10; i++) {            System.out.println("一个新的线程");        }    }    //主线程    public static void main(String[] args) {        //3.使用静态代理模式开启线程        TestNewThread02 thread02 = new TestNewThread02();        Thread t = new Thread(thread02);        t.start();        System.out.println("main线程");    }}

在多线程的这种实现方法中就用到了静态代理模式,其实Thread类就相当于是代理(例子里里面的婚庆公司),它代理TestNewThread02类去实现start()方法。其实Thread类也实现了Runnable,TestNewThread02类也实现了Runnnable,只是我们平时没有注意到而已,点开Thread的源码:

在这里插入图片描述
我们发现Thread也实现了Runnable,所以线程的这种实现方法就是一个标准的静态代理模式。

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

你可能感兴趣的文章
nginx实现请求的负载均衡 + keepalived实现nginx的高可用
查看>>
linux shell 中数组的定义和for循环遍历的方法
查看>>
求1!+2!+3!....+20!(java代码)
查看>>
VMware安装Ubuntu系统无法选择语言
查看>>
QT5.12安装
查看>>
Git/Github初步使用记录
查看>>
QT 开发问题合集
查看>>
Github使用问题合集
查看>>
QT多线程服务器
查看>>
Ubuntu 18.04.2 ulimit配置
查看>>
Ubuntu Mysql 安装与配置
查看>>
QT5.12 Mysql驱动未能加载问题
查看>>
现场直击|SequoiaDB@SIGMOD 2021:关注数据库的根科技存储技术
查看>>
赋能政企智慧办公,巨杉数据库与致远互联完成产品互认证
查看>>
SequoiaDB湖仓一体架构亮相 ACM SIGMOD 2021
查看>>
信通院发布第十二批大数据产品能力评测结果,巨杉数据库两款产品通过
查看>>
巨杉数据库荣获2020年度河南省科学技术进步奖
查看>>
湖仓一体提升管理效率 培育数据沃土
查看>>
报名启动!巨杉数据库 2021 湖仓一体技术大赛带你进入分布式技术的星辰大海
查看>>
H2数据库用户自定义函数方法及范例
查看>>