大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE稳定放心使用
为什么要学代理模式?
因为这就是SpringAOP的底层!
代理模式的分类:
- 静态代理
- 动态代理
静态代理
角色分析:
- 抽象角色:一般会使用接口或抽象类来解决
- 真是角色:被代理的角色
- 代理角色:代理真实角色,代理真实角色后,我们一般会做一些附属操作
- 客户:访问代理对象的人!
代码步骤:
- 接口(Rent.java)
package com.company.org;
public interface Rent {
public void rent();
}
- 真实角色(Host.java)
package com.company.org;
public class Host implements Rent {
public void rent(){
System.out.println("房东要出租房子!");
}
}
- 代理角色(Proxy.java)
package com.company.org;
public class Proxy {
private Host host;
public Proxy(){
}
public Proxy(Host host){
this.host = host;
}
public void rent(){
host.rent();
}
// 看房
public void seeHost(){
System.out.println("中介带你看房");
}
public void hetong(){
System.out.println("签租赁合同");
}
public void fare(){
System.out.println("收中介费");
}
}
- 客户端访问代理角色(Client.java)
package com.company.org;
public class Client {
public static void main(String[] args) {
// 房东要租房子
Host host = new Host();
// 代理,中介帮房东租房子,但是呢,代理一般会有一些附属操作
Proxy proxy = new Proxy(host);
// 你不用面对房东,直接找中介租房即可
proxy.rent();
}
}
代理模式的好处:
- 可以使真实角色的操作更加纯粹,不用去关注一些公共的业务
- 公共业务就交给了代理角色,实现了业务的分工
- 公共业务发展扩展的时候,方便集中管理
代理模式的缺点:
- 一个真实角色就会产生一个代理角色,代码量会翻倍——开发效率会变低。
—————————————————————————————————————————————————
下面再通过一个例子体会一下代理的作用。
假设我们有这样一个项目:
其中每一个文件的代码如下:
UserService.java
package Demo;
public interface UserService {
public void add();
public void delete();
public void update();
public void query();
}
UserServiceImpl.java
package Demo;
public class UserServiceImpl implements UserService {
public void add() {
System.out.println("增加了一个用户");
}
public void delete() {
System.out.println("删除了一个用户");
}
public void update() {
System.out.println("修改了一个用户");
}
public void query() {
System.out.println("查询了一个用户");
}
}
Client.java
package Demo;
public class Client {
public static void main(String[] args) {
UserServiceImpl userService = new UserServiceImpl();
userService.add();
}
}
上面的代码很简单,就不再用文字赘述了。
假设该项目现在又加了一个需求,即:在执行操作之前,先输出日志。
按照以往的方法是,在每一个操作的方法中,添加一句输出就行了。但是,改动原来的代码是企业开发的大忌!
于是,我们可以新建一个文件,来调用原来的代码,并且在新文件中把新的需求加上,这样就可以不修改以前的代码了。这个新的文件就可以称为“代理”。
新建的代理文件为 UserServiceProxy.java,代码如下
package Demo;
public class UserServiceProxy implements UserService {
private UserServiceImpl userService;
// 设置代理谁
public void setUserService(UserServiceImpl userService){
this.userService = userService;
}
public void add() {
printLog("add");
System.out.println("增加了一个用户");
}
public void delete() {
printLog("delete");
System.out.println("删除了一个用户");
}
public void update() {
printLog("update");
System.out.println("修改了一个用户");
}
public void query() {
printLog("query");
System.out.println("查询了一个用户");
}
// 打印日志
public void printLog(String msg){
System.out.println("使用了" + msg + "方法.");
}
}
相应的client的代码需要改动为
package Demo;
public class Client {
public static void main(String[] args) {
UserServiceImpl userService = new UserServiceImpl();
// 声明代理
UserServiceProxy proxy = new UserServiceProxy();
// 设置代理谁
proxy.setUserService(userService);
proxy.add();
}
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/181119.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...