想说的话:
在大学的时候曾经学过这23种设计模式,但是那时没啥编程经验,糊里糊涂过了一遍,没多久就忘记了,工作之后将精力主要集中在学习新技术上,比如springboot,cloud,docker,vue。毕业两年后去面试,发现设计模式还是java程序员需要迈过的一道坎,面试的时候问到代理模式和适配器模式有什么区别,你在工作中用到了什么设计模式,怎么用的?答不上来的特别尴尬,所以决定重新学习这几种设计模式,争取在工作中使用上。

本文所有案例代码

码云:https://gitee.com/helloworld6379/designPattern
Github:Github地址

设计模式概述

1 设计模式是程序员在面对同类软件工程设计问题所总结出来的有用的经验,模式不是代码,而是某类问题的通
用解决方案,设计模式(Design pattern)代表了最佳的实践。这些解决方案是众多软件开发人员经过相当长的
一段时间的试验和错误总结出来的。
2 设计模式的本质提高 软件的维护性,通用性和扩展性,并降低软件的复杂度。
3 设计模式并不局限于某种语言,java,php,c++ 都有设计模式.

设计模式类型
设计模式分为三种类型,共 23 种
1 创建型模式:单例模式、抽象工厂模式、原型模式、建造者模式、工厂模式。
2 结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
3 行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter 模式)、状态模式、策略模式、职责链模式(责任链模式)。

简单介绍

  1. 代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象.这样做的好处 是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。
  2. 被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象
  3. 代理模式有不同的形式, 主要有三种 静态代理、动态代理 (JDK 代理、接口代理)和 Cglib 代理 (可以在内存 动态的创建对象,而不需要实现接口, 属于动态代理的范畴) 。

静态代理

静态代理在使用时,需要定义接口或者父类,被代理对象(即目标对象)与代理对象一起实现相同的接口或者是继承相同父类。

以电脑快捷方式为例:

/*** @Description 被代理对象接口* @Author: LiuXing* @Date: 2020/5/28 21:32*/
public interface Application {void watchMovie();
}
/*** @Description 被代理对象实体类* @Author: LiuXing* @Date: 2020/5/28 21:32*/
public class KuaiBo implements Application {@Overridepublic void watchMovie() {System.out.println("使用快播看小电影。");}
}
/*** @Description 代理对象* @Author: LiuXing* @Date: 2020/5/28 21:32*/
public class KuaiBoInk implements Application{private Application app;public KuaiBoInk(Application app){this.app = app;}@Overridepublic void watchMovie() {app.watchMovie();}
}
/*** @Description 静态代理模式* @Author: LiuXing* @Date: 2020/5/28 21:32*/
public class StaticProxyTest {public static void main(String[] args) {//创建目标对象(被代理对象)KuaiBo kuaiBo = new KuaiBo();//创建代理对象, 同时将被代理对象传递给代理对象KuaiBoInk kuaiBoInk = new KuaiBoInk(kuaiBo);//通过代理对象,调用到被代理对象的方法 // 即:执行的是代理对象的方法,代理对象再去调用目标对象的方法kuaiBoInk.watchMovie();}
}

动态代理

  1. 代理对象,不需要实现接口,但是目标对象要实现接口,否则不能用动态代理 。
  2. 代理对象的生成,是利用 JDK 的 API,动态的在内存中构建代理对象 。
  3. 动态代理也叫做:JDK 代理、接口代理。
/*** @Description 被代理对象接口* @Author: LiuXing* @Date: 2020/5/28 21:32*/
public interface Application {void watchMovie();void downloadMovie(String movie);
}
/*** @Description 被代理对象实体类* @Author: LiuXing* @Date: 2020/5/28 21:32*/
public class KuaiBo implements Application {@Overridepublic void watchMovie() {System.out.println("使用快播看小电影。");}@Overridepublic void downloadMovie(String movie) {System.out.println("下载" + movie);}
}
package com.fighting.pattern.proxy.dynamic;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;/*** @Description 代理工厂* @Author: LiuXing* @Date: 2020/5/28 21:32*/
public class ProxyFactory {//维护一个目标对象Objectprivate Object target;//构造器,对target进行初始化public ProxyFactory(Object target) {this.target = target;}//给目标对象 生成一个代理对象public Object getProxyInstance() {//说明/** publicstaticObjectnewProxyInstance(ClassLoaderloader, Class<?>[]interfaces, InvocationHandlerh)//1.ClassLoaderloader : 指定当前目标对象使用的类加载器, 获取加载器的方法固定//2.Class<?>[]interfaces: 目标对象实现的接口类型,使用泛型方法确认类型//3.InvocationHandlerh: 事情处理,执行目标对象的方法时,会触发事情处理器方法, 会把当前执行的目标对象方法作为参数传入*/return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("JDK 代理开始~~");//反射机制调用目标对象的方法Object invoke = method.invoke(target, args);System.out.println("JDK 代理提交");return invoke;}});}}
/*** @Description 动态代理模式测试* @Author: LiuXing* @Date: 2020/5/28 21:32*/
public class StaticProxyTest {public static void main(String[] args) {Application kuaiBo = new KuaiBo();Application proxyInstance = (Application)new ProxyFactory(kuaiBo).getProxyInstance();//proxyInstance=classcom.sun.proxy.$Proxy0 内存中动态生成了代理对象 System.out.println("proxyInstance = " + proxyInstance.getClass());proxyInstance.downloadMovie("十六歳のロリ嬌羞初体験.avi");proxyInstance.watchMovie();}
}

23种设计模式学习记录之代理模式相关推荐

  1. 23种设计模式(7)-代理模式

    定义: 为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用 角色: 1,  抽象角色:声明真实对象 ...

  2. 设计模式——23种设计模式学习总结

    声明:本文为个人笔记,用于学习研究使用非商用,内容为个人研究及综合整理所得,若有违规,请联系,违规必改. 系列文章目录 简单工厂模式 策略模式模式 装饰模式(进行中) 代理模式(进行中) 工厂方法模式 ...

  3. JavaScript 23 种设计模式之 4 抽象工厂模式

    JavaScript 23 种设计模式之 4 抽象工厂模式 概念与特点 结构与实现 应用场景 应用实例 总结 概念与特点 概念: 提供一组相关或相互依赖对象的接口.抽象工厂模式是工厂方法模式的升级版, ...

  4. 设计模式学习之1—代理模式

    设计模式学习之1-代理模式 0.?先看这里 --- 诗雨的学习说明 1.从生活中初识代理 2.代理模式的类图和角色 3.静态代理和动态代理 4.静态代理 和 动态代理 的 使用模板 4.1 静态代理使 ...

  5. 23种设计模式之单例模式、工厂模式、原型模式、建造者模式

    系列文章目录 第一章:程序设计原则-单一职责.接口隔离.依赖倒置.里式替换 第二章:程序设计原则-开闭原则.迪米特法则.合成复用原则 文章目录 系列文章目录 一.设计模式简单介绍 1.1.什么是设计模 ...

  6. java 23种设计模式学习。

    一.3大类设计模式:创建型,结构型,行为型. a.5种创建型模式:工厂方法,抽象工厂,单例,建造者,原型. b.7种结构型模式:适配器,装饰器,代理,外观,桥接,组合,享元. c.11种行为型模式:策 ...

  7. 23种设计模式(十一)外观模式(阁瑞钛伦特软件-九耶实训)

    常说的设计模式是23种设计模式,分为3大类: 创建型模式5种:工厂方法.抽象工厂.单例.建造者.原型 结构型模式7种:适配器.代理.桥接.装饰者.外观.享元.组合 行为型模式11种:模板方法.解释器. ...

  8. Unity实现:23种设计模式、《游戏编程模式》

    目录 一.23种设计模式在Unity实现 Creational Patterns 创建型模式(5种) 工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式 Structural Patterns ...

  9. 23种设计模式(第二章创建者模式5种)

    第二章创建者模式 单例模式 单例模式有 3 个特点: 单例类只有一个实例对象: 该单例对象必须由单例类自行创建: 单例类对外提供一个访问该单例的全局访问点. 单例模式的实现 单例设计模式分类两种: ​ ...

最新文章

  1. 14,matlab中如何查看程序中所调用的函数
  2. 领结婚证了,新的人生开始了!
  3. 从输入流中获取数据并以字节数组返回
  4. LeetCode44 Wildcard Matching
  5. ConcurrentHashMap和Collections.synchronizedMap(Map)的区别是什么?
  6. 【Pytorch神经网络实战案例】12 利用注意力机制的神经网络实现对FashionMNIST数据集图片的分类
  7. 理想汽车市值逼近蔚来,王兴曾多次在饭否为其站台
  8. L2TP 配置实例——CALL LNS
  9. python安装后怎样配解释器_各个系统下的Python解释器相关安装方法
  10. java8 32位脱机安装_java8离线安装包32位 官方最新版
  11. 有没有一瞬间不想活了?
  12. vant swipe 三图一屏
  13. 朋友之间最舒服的关系
  14. 论剑江湖服务器维护,楚留香629维护内容介绍 名剑天下论剑洗心见武深夜酒馆_游侠手游...
  15. abr-summary 和asbr-summary命令中的not-advertise参数
  16. poi 删除 word文档中的图片
  17. 创建表空间oracle10g,Oracle10g创建表空间慢问题
  18. 【每日一题】JVM篇-年轻代到年老代的晋升过程的判断条件是什么呢
  19. JDBC学习笔记(1)---B站尚硅谷宋红康
  20. Spring基础(持续更新)

热门文章

  1. windows7系统损坏修复_UEFI?安装纯净的 Windows 7/10 系统
  2. 华为日历怎么显示一月_南京百达翡丽服务去哪里表蒙摔碎了怎么办
  3. 夏天到来了,可以去做这5个生意,投入成本不大,利润却非常不错
  4. Druid连接池的使用讲解
  5. Atitit 错误处理机制:(1)静默模式(2)警告模式 (3)异常模式
  6. 【HBase学习笔记-尚硅谷-Java API shell命令 谷粒微博案例】
  7. 国行Switch Joy-Con手柄-摇杆漂移的官方解决方法(送修)
  8. macOS外接显示器字体画面模糊虚化已解决
  9. 多个pdf 合并成一个pdf 并且pdf加密
  10. 数字信号处理二:离散时间信号的运算