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;
}

@Override
public 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();
}

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

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

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

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

于是聪明的程序员巧妙地在两个区间加了一层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{
@Override
public User getUser() {
System.out.println("获取用户数据!");
return MyObjs.myDao.getUser();
}

@Override
public User updateUser(String name){
System.out.println("更新用户数据!");
MyObjs.myDao.updateName(name);
return getUser();
}
}

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

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

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

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

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

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());
}
}

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

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

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


   系列内容

《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) 匿名内部类和静态内部类

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

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

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