《Java 核心技术 卷1》 笔记 第六章 接口和内部类(6) 静态代理

article/2025/5/12 6:54:36

6.5 代理

啥是代理?代理人就是替你办事的那个人。比如点了外卖,外卖小哥就是你取餐的代理人。代理除了能完成既定任务,还可以完成额外任务。比如,你留言让他给你带瓶可乐。代理类就是替一个类完成委托地另一个类。

6.5.1 静态代理

静态代理就是你的代理能替你干所有事,但是它只能替你完成这些事,无法帮其他人完成事情。

实际生活中常用的就是用户查询自己的个人信息,通过一个叫Controller的东西,Controller把查询的事委托给Service,Service从数据库(DAO层)获取用户的全部信息,筛选出需要的个人信息,返回给用户。

这三部分,其实是可以省略中间的Service层的。但如果省略,其他获取数据信息的Controller有相似的步骤,拿就需要再写一次,就会造成代码重复。

不加Service层次的代码:

public class MyController {public User getUser(){return MyObjs.myService.getUser();}public User updateUser(String name){return MyObjs.myService.updateUser(name);}
}
public class MyDao {User u;{u = new User();u.setId(1);u.setName("yu-niang-niang");}public User getUser(){System.out.println("获取数据库用户数据!");return u;}public void updateName(String name){System.out.println("更新数据库用户数据!");u.setName(name);}
}
public class User {int id;String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +'}';}
}
public class Main {public static void main(String[] args) throws CloneNotSupportedException, InterruptedException {Main solution = new Main();MyController controller = new MyController();User u = controller.getUser();System.out.println(u);u = controller.updateUser("yu_duan_hun");System.out.println(u);}
}
public class MyObjs {public static MyDao myDao = new MyDao();public static MyService myService = new MyServiceImpl();
}

我们希望每次操作数据库前,有一句相同的提示信息:

然后就发现,同样的代码内容,居然要写两次!这非常的糟糕。不断重复写相同的代码假设我想换个提示:“获取用户数据成功了!”就要修改两次。

于是聪明的程序员巧妙地在两个区间加了一层Service代码,Service代码增加和Controller代码修改如下:

public class MyController {public User getUser(){return MyObjs.myService.getUser();}public User updateUser(String name){return MyObjs.myService.updateUser(name);}
}
public interface MyService {User getUser();User updateUser(String name);
}
public class MyServiceImpl implements MyService{@Overridepublic User getUser() {System.out.println("获取用户数据!");return MyObjs.myDao.getUser();}@Overridepublic User updateUser(String name){System.out.println("更新用户数据!");MyObjs.myDao.updateName(name);return getUser();}
}

你看完了可能大呼一声:你这个骗子!这不就是一个方法引用另一个方法么?你改什么了?

这和直接在MyController写个方法有区别吗?还真有。

public class YourController {public User curr(){return MyObjs.myService.getUser();}
}
public class Main {public static void main(String[] args) throws CloneNotSupportedException, InterruptedException {Main solution = new Main();MyController controller = new MyController();User u = controller.getUser();System.out.println(u);u = controller.updateUser("yu_duan_hun");System.out.println(u);YourController yourController = new YourController();System.out.println(yourController.curr());}
}

我们又定义一个YourController,同样获取用户信息,自动就有输出信息了。如果这个方法写在MyController内部,就无法达到同等目的,还需要在YourController中再定义一次方法,造成方法冗余。

   系列内容

《Java 核心技术 卷1》 笔记:第一章 Java程序设计概述

《Java 核心技术 卷1》 笔记:第二章 Java程序设计环境

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(1)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(2)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(3)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(4)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(5)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(6)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(7)大数处理、数组、多维数组、控制台传参

《Java 核心技术 卷1》 笔记 第四章:类与对象

《Java 核心技术 卷1》 笔记 第四章:类与对象(2) GregorianCalendar 与 类的基本组成

《Java 核心技术 卷1》 笔记 第四章:类与对象(3) 构造器全局私有方法

《Java 核心技术 卷1》 笔记 第四章:类与对象(4) 静态字段+静态方法+工厂方法

《Java 核心技术 卷1》 笔记 第四章:类与对象(5) 形参与实参 构造器的默认值与默认构造

《Java 核心技术 卷1》 笔记 第四章:类与对象(6) 构造器调用与初始化块

《Java 核心技术 卷1》 笔记 第四章:类与对象(7) 注释、JavaDoc与类设计

《Java 核心技术 卷1》 笔记 第五章 继承

《Java 核心技术 卷1》 笔记 第五章 继承(2)

《Java 核心技术 卷1》 笔记 第五章 继承(3)

《Java 核心技术 卷1》 笔记 第五章 继承(4)equals方法

《Java 核心技术 卷1》 笔记 第五章 继承(5)hashCode 与 toString

《Java 核心技术 卷1》 笔记 第五章 继承(6) 泛型

《Java 核心技术 卷1》 笔记 第五章 继承(7) 包装类和可变数组

《Java 核心技术 卷1》 笔记 第五章 继承(8) 枚举类与类反射

《Java 核心技术 卷1》 笔记 第五章 继承(9) 异常捕获与反射运用

《Java 核心技术 卷1》 笔记 第五章 继承(10)反射

《Java 核心技术 卷1》 笔记 第五章 继承(11)反射泛型数组+方法指针+类设计技巧

《Java 核心技术 卷1》 笔记 第六章 接口和内部类

《Java 核心技术 卷1》 笔记 第六章 接口和内部类(2)

《Java 核心技术 卷1》 笔记 第六章 接口和内部类(3) 接口回调与内部类

《Java 核心技术 卷1》 笔记 第六章 接口和内部类(4) 局部内部类和局部内部类引用方法变量分析

《Java 核心技术 卷1》 笔记 第六章 接口和内部类(5) 匿名内部类和静态内部类

喜欢的话,点个赞吧~!平时做题,以及笔记内容将更新到公众号。

关注公众号,互相学习:钰娘娘知识汇总

 


http://chatgpt.dhexx.cn/article/6fBvrXI9.shtml

相关文章

新书推荐 | Java核心技术卷Ⅰ:基础知识(原书第11版)

新书推荐 《Java核心技术卷Ⅰ:基础知识(原书第11版)》 长按二维码了解及购买 全新第11版!针对Java SE9、10、11全面更新!Java领域极具影响力和价值的著作之一,与《Java编程思想》齐名,10余年全球…

【Java核心技术卷】谈谈对Java平台的理解

专题 | 谈谈对Java平台的理解 2019年4月24日下午 沉晓 学Java已经快两个月了,结果被问到 "你能给我解释一下什么是Java平台吗?" 结果支支吾吾地说了一大堆,却毫无逻辑可言,感觉超级失败 我觉得很有必要重新谈谈我对Java平台的认识,帮我理清逻辑的同时,希望能够…

对《Java核心技术卷一》读者的一些建议

思想不会变,所以《Java编程思想》还停留在第 4 版(2007 年);而技术是要更新迭代的,所以《Java核心技术卷一》来到了第十版(2016 年)。 我们来看一下《Java核心技术卷一》第十版的大纲。 前九章…

Java核心技术卷1基础知识课程-专题视频课程

Java核心技术卷1基础知识课程—2人已学习 课程介绍 Java核心技术入门视频培训课程:该教程系统全面讲解Java语言的核心概念,语法,重要特性和开发方法,讲解Java开发工具跟编程思想、用Java开发具体的系统程序,让…

Java核心技术卷II:高级特性

网站 更多书籍点击进入>> CiCi岛 下载 电子版仅供预览及学习交流使用,下载后请24小时内删除,支持正版,喜欢的请购买正版书籍 电子书下载(皮皮云盘-点击“普通下载”)购买正版 封页 内容简介 本书是Java领域有影响力和价值的著作之…

# java 核心技术卷1 (原书第11版)通读 第一章:java的基本程序设计结构

前言: 我是一名前端开发人员,因为想自学java,根据网络上的推荐顺序,决定从呼声最高的 java 核心卷 11版 读起(PS:其实12版已经出来了,但是只有实体书,没有电子版呀。实体书太贵了,7…

Java核心技术卷1:基础知识(原书第10版)

本书为专业程序员解决实际问题而写,Java基础知识面覆盖很完整,可以帮助你深入了解Java语言和库。在卷I中,Horstmann主要强调基本语言概念和现代用户界面编程基础,深入介绍了从Java面向对象编程到泛型、集合、lambda表达式、Swing …

【Java核心技术卷】I/O详析

文章目录 概述Java io基本概念关于流流的分类 Java io框架一、以字节为单位的输出流的框架图(1)框架图图示(2)OutputStream详解(3)OutputStream子类(4)引申:打印流 二、以…

java核心技术卷1基础知识整理

java核心技术卷1基础知识整理 1.java概述2.java程序设计3.对象与类4 继承5 接口、lambda 表达式与内部类6 并发 1.java概述 1.Java 剔除了 C 中许多很少使用、 难以理解、 易混淆的特性, 在目前看来, 这些特性带来的麻烦远远多于其带来的好处。 2.Java …

《Java核心技术卷1》

第3章 Java的基础程序设计结构 整型 用int类型表示一百万可以这么写(since 1.7) int a 1_000_000; System.out.println(a);//1000000可用0b或0B表示二进制(同样since 1.7) byte a 0b0000_0010; System.out.println(a);//2如出…

vue class style 三元运算

<span :style"{color: true ? red : }">test1</span> <span :class"{show: true,hide: false}">test2</span>

Vue 实现拖拽模块(一)拖拽添加组件

本文主要介绍了vue拖拽组件实现构建页面的简单实现&#xff0c;文中通过示例代码介绍&#xff0c;感兴趣的小伙伴们可以了解一下 本文主要介绍了 Vue拖拽添加组件的简单实现&#xff0c;具体如下&#xff1a; 效果图 实现思路 使用 H5 的新特性拖放操作来实现&#xff0c;拖…

vue拖拽三种方法

如果想拖拽排序的可以用组件&#xff1a;vuedraggable。 组件安装 npm i vuedraggable -S引入 import draggable from vuedraggable配置项 group: string or array 分组用的&#xff0c;同一组的不同list可以相互拖动 sort: boolean 定义是否可以拖拽 delay:number 定义鼠标…

Vue3 CSS v-bind 计算和三元运算

官方文档 中指出&#xff1a;CSS 中的 v-bind 支持 JavaScript 表达式&#xff0c;但需要用引号包裹起来&#xff1a; 例子如下&#xff1a; <script lang"ts" setup> const treeContentWidth ref(140); </script><style lang"less" scop…

【记】Vue - 拖拽元素组件实现

需求描述&#xff1a; 1.可实现PC/移动端元素拖拽移动 2.支持2种模式&#xff1a;1.元素跟随光标点放置2.元素在光标点平齐位置靠侧边吸附 市面上估计有很多这种组件和功能了&#xff0c;但我没找到合适的&#xff0c;用了VueUse的useDraggable Function感觉不太适合某些应用…

Vue:可拖拽组件

在实际开发中&#xff0c;很可能会遇到开发可拖拽组件的需求&#xff0c;目的是应对某些弹框组件会遮盖某些重要信息/可操作面板&#xff0c;通过可拖拽的形式可以将上层的弹框组件移动到其他位置&#xff0c;从而不影响整个系统的操作。下面&#xff0c;我们分两步走&#xff…

vue+ element 三元运算符设置按钮样式

效果图 代码块 <el-button-group><el-button size"small" click"notSelect()" :class"[status 1?isActive:]" autofocus"true" v-focus plain>待选</el-button><el-button size"small" click"…

vue三目运算符可以写html代码么,Vue-js之文本渲染、属性(样式)绑定、三元运算符、事件处理...

文本渲染之3种方式 1.{{}}&#xff1a;插值表达式 弊端&#xff1a;会出现页面闪烁问题 v-text&#xff1a;把vue实例中的内容当作纯文本&#xff0c;显示在浏览器 v-html&#xff1a;把vue实例中的内容进行渲染后&#xff0c;浏览器会再次执行文本渲染 {{msg}} let vm new Vu…

vue中的三元运算符

我们要做的效果如下&#xff1a; 如上图的全部分类效果&#xff0c;符号、的样式具体写法如下图&#xff1a;数据如下&#xff1a; 补充&#xff1a;我们一开始想的可能是在数据中直接加符号、&#xff0c;但是脑子想让我换个想法&#xff0c;所以想先控制显示&#xff0c;第一…