Java代理之静态代理
什么是代理
代理就是给目标对象一个代理对象,并由代理对象控制目标的引用。
为什么要使用代理模式
1、通过引入代理对象的方式,可以间接的访问目标对象,避免直接访问目标对象给系统带来不必要的复杂性。
2、通过代理对象可以对原有的业务进行业务增强处理。
举例:如果我们需要买国外的某一件商品A,这个时候我们一般有两个途径要么直接去国外买,要么可以找一些代购人员帮我们去购买。在这种情况下,我们由于直接去国外买,实在是太耗软妹币,而且还要花时间等等,这个时候我们最优的选择就是找代购购买,这样也帮我们省去了很多麻烦的事情。
代理模式类图
代码示例
抽象对象:
public interface ITargetFactoryService {
void sale(String name);
}
目标对象:
@Slf4j
public class TargetFactoryServiceImpl implements ITargetFactoryService {
@Override
public void sale(String name) {
log.info(name+"购买了商品A");
}
}
代理对象:
@Slf4j
public class ProxyImpl implements ITargetFactoryService {
public ITargetFactoryService service;
public ProxyImpl(ITargetFactoryService service){
super();
this.service = service;
}
@Override
public void sale(String name) {
before();
service.sale("代购");
after();
}
/**
* 后置增强
*/
private void after() {
log.info("代购在购买后得到了市场调研结果");
}
/**
* 前置增强
*/
private void before() {
log.info("代购在购买前做了市场调研");
}
}
测试类:
@Slf4j
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, JdbcTemplateAutoConfiguration.class})
public class SpsringJdbcApplication {
public static void main(String[] args) {
TargetFactoryServiceImpl service = new TargetFactoryServiceImpl();
ProxyImpl proxy = new ProxyImpl(service);
proxy.sale("代购");
SpringApplication.run(SpsringJdbcApplication.class, args);
}
}
测试结果:
我们可以在代码示例中清晰的看到,在代理类中,代理对象包含了目标对象,并且在业务处理上进行了一定的业务扩展,但是却和目标对象继承于同一个接口。但是此扩展基于Spring AOP来讲,以更加专业的叫法为前置增强、后置增强。
此类代理便是我们常说的静态代理,静态代理适合在业务比较简单,实现类少,需求变化不频繁,但是却要对原有目标服务对象功能进行扩展,并且不去修改原有服务,这个时候我们就可以选择使用静态代理。
静态代理的缺点
如果此时我们业务需要进行扩展,我们的代购同学在经过市场调研以后,发现商品B更加受大家欢迎,这个时候我们就需要对自己的业务进行扩展了,怎么扩展呢?一起接着往下看。
抽象对象:
public interface ITargetFactoryBService {
void saleB(String name);
}
目标对象:
@Slf4j
public class ITargetFactoryBServiceImpl implements ITargetFactoryBService {
@Override
public void saleB(String name) {
log.info(name + "购买了商品B");
}
}
代理对象:
@Slf4j
public class ProxyTwoImpl implements ITargetFactoryService, ITargetFactoryBService {
public ITargetFactoryService service;
public ITargetFactoryBService bService;
public ProxyTwoImpl(ITargetFactoryService service,ITargetFactoryBService bService){
super();
this.service = service;
this.bService = bService;
}
@Override
public void sale(String name) {
before();
service.sale("代购");
after();
}
@Override
public void saleB(String name) {
before();
bService.saleB("代购");
after();
}
/**
* 后置增强
*/
private void after() {
log.info("代购在购买后得到了市场调研结果");
}
/**
* 前置增强
*/
private void before() {
log.info("代购在购买前做了市场调研");
}
}
测试类:
@Slf4j
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, JdbcTemplateAutoConfiguration.class})
public class SpsringJdbcApplication {
public static void main(String[] args) {
TargetFactoryServiceImpl service = new TargetFactoryServiceImpl();
ITargetFactoryBServiceImpl bService = new ITargetFactoryBServiceImpl();
ProxyTwoImpl proxy2 = new ProxyTwoImpl(service, bService);
proxy2.sale("代购");
proxy2.saleB("代购");
SpringApplication.run(SpsringJdbcApplication.class, args);
}
}
结果:
我们可以看到,在实现业务扩展的时候,需要对原有的代理类进行修改,如果后期我们需要扩展的业务较多的时候,这个类将变的更加繁杂,大量的继承以及方法重写,以至于牵一发而动全身,所以在这种业务扩展性高、业务变化频繁的情况下我们不建议使用静态代理。
静态代理总结:
1、违反Java设计模式开闭原则,即:程序对外扩展开放,对修改关闭。当需求进行变更时,我们应该是新增代码块来实现,而不是在原来的代码中进行修改实现。
2、扩展性很差。
3、可维护性差。
4、代码耦合度高。
如果觉着不错可以关注公众号:Java秃头猿,专注于项目实际开发技术分享。
Java代理之静态代理的更多相关文章
- Java代理模式/静态代理/动态代理
代理模式:即Proxy Pattern,常用的设计模式之一.代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问. 代理概念 :为某个对象提供一个代理,以控制对这个对象的访问. 代理类和委 ...
- 【Java】代处理?代理模式 - 静态代理,动态代理
>不用代理 有时候,我希望在一些方法前后都打印一些日志,于是有了如下代码. 这是一个处理float类型加法的方法,我想在调用它前打印一下参数,调用后打印下计算结果.(至于为什么不直接用+号运算, ...
- Java代理模式——静态代理模式
一:代理模式 代理模式的作用是:为其他对象提供一种代理以控制这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 二:代理模式设计 ...
- 黑马程序员:Java基础总结----静态代理模式&动态代理
黑马程序员:Java基础总结 静态代理模式&动态代理 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 静态代理模式 public class Ts { ...
- 017 Java中的静态代理、JDK动态代理、cglib动态代理
一.静态代理 代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是指静态代理,也就是在代码中显式指定的代理. 静态代理由业务实现类.业务代理类两部分组成.业务实现类负责实现主要的业务方法,业 ...
- Java中的代理模式--静态代理和动态代理本质理解
代理模式定义:为其他对象提供了一种代理以控制对这个对象的访问. 代理模式的三种角色: Subject抽象主题角色:抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求. Real ...
- JAVA设计模式——代理(静态代理)
定义 为其它的对象提供一种代理,以控制这个对象的访问 使用场景 当不想直接访问某个对象的时候,就可以通过代理 1.不想买午餐,同事帮忙带 2.买车不用去厂里,去4s店 3.去代理点买火车票,不用去车站 ...
- java代理:静态代理和动态代理
一.Java中有一个设计模式是代理模式 代理模式是常用的Java设计模式,特征是代理类与委托类有相同的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 代理类 ...
- java 基础 --- 动态代理和静态代理
问题 : 代理的应用场景是什么 动态代理的底层原理是什么,为什么只能继承接口 概述 代理模式是设计模式的一种,简单地说就是调用代理类的方法实际就是调用真实类的方法.这种模式在AOP (切面编程)中非 ...
- Java中的静态代理实现方式
1.编写一个接口类 如:Subject package com.neusoft.pattern.staticProxy; /** * <p>Title:</p> * <p ...
随机推荐
- Mixed Precision Training —— caffe-float16
简介 最近有了突如其来的想法,如何把caffe的变得更小更快.后来翻到Nvidia开发caffe-float16,同时也看到它的论文.看完大致了解一番后,就做一下记录. 该工作的目标是,减少网络的所需 ...
- JS 前端框架笔记
Swiper轮播图插件使用 官网:https://www.swiper.com.cn/ 先引用插件的css.js文件 然后找到需要使用的轮播图文件中去把HTML css和JS代 ...
- 高级搜索树-伸展树(Splay Tree)
目录 局部性 双层伸展 查找操作 插入操作 删除操作 性能分析 完整源码 与AVL树一样,伸展树(Splay Tree)也是平衡二叉搜索树的一致,伸展树无需时刻都严格保持整棵树的平衡,也不需要对基本的 ...
- CSDN新版Markdown编辑器(Alpha 2.0版)
Markdown编辑器 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建 ...
- C#LeetCode刷题之#88-合并两个有序数组(Merge Sorted Array)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3686 访问. 给定两个有序整数数组 nums1 和 nums2, ...
- C#LeetCode刷题之#35-搜索插入位置(Search Insert Position)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3979 访问. 给定一个排序数组和一个目标值,在数组中找到目标值, ...
- HTML实例-01-轮播图
body部分 <div class="outer"> <ul class="img-list"> <li><a hr ...
- Mac中的垃圾文件的清理
一 前言 最近发现mac的存储空间不够了,看一下系统的存储空间如下图所示,这个其他占了160+G的存储空间,那么这个其他到底包含什么东西呢?在网上查了很久,找到一种比较认可的说法是这样的: 不同Mac ...
- 【原创】Linux虚拟化KVM-Qemu分析(一)
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: KVM版本:5.9 ...
- Mybatis中List传值
Mybatis遇到List传值时常用方法. 1. List<E>,E为基本数据类型和String Mapper类文件: List<User> selectByIds(List& ...