Java接口有多个实现类,根据不同的业务场景创建不同的实现类实例

Java允许实现多个接口 通过实现多个接口,Java语言为我们提供了一种强大的工具,使我们能够更好地组织和设计我们的代码。如果多个接口中的方法具有相同的名称和参数列表,但是提供了不同的实现,我们可以通过重写方法来解决冲突。如果多个接口中的方法具有相同的名称和参数列表,但是提供了不同的实现,我们可以通过重写方法来解决冲突。通过实现多个接口,Java语言确实为我们提供了一种强大的工具,使我们能够更好地组织和设计我们的代码。Java中实现多个接口非常简单。通过上述方式,我们可以在实现类中明确指定要调用的接口方法,从而解决方法冲突的问题。 阅读详情

作为一个稀有的Java妹子,所写的所有博客都只是当作自己的笔记,留下证据自己之前是有用心学习的~哈哈哈哈(如果有不对的地方,也请大家指出,不要悄悄咪咪的不告诉我)

1.概述

有的时候,需要一个接口根据不同的业务场景实现不同的功能,比如支付接口有多个运营商,不同的运营商的对接方式不同,但是对自己本身的系统来说,入口应该只有一个,就是调用的接口是同一个,不过有不同的实现类,来完成不同的支付方式的对接。

2.上代码

用户的授权接口,根据不同的传参调用不同的认证方法,验证方法有:校验密码、校验密码和验证码等等,这个根据业务场景自定义。
1、定义接口

public interface ITokenGranter {

	/**
	 * 获取用户信息
	 *
	 * @param tokenParameter 授权参数
	 * @return UserInfo
	 */
	UserInfo grant(TokenParameter tokenParameter);

}

2、写不同的实现类
(1)、校验验证码和密码

@Component
public class CaptchaTokenGranter implements ITokenGranter {

	public static final String GRANT_TYPE = "captcha";

	private IUserClient userClient;
	private RedisUtil redisUtil;

	//校验方法的实现类
	@Override
	public UserInfo grant(TokenParameter tokenParameter) {
		HttpServletRequest request = WebUtil.getRequest();

		String key = request.getHeader(TokenUtil.CAPTCHA_HEADER_KEY);
		String code = request.getHeader(TokenUtil.CAPTCHA_HEADER_CODE);
		// 获取验证码
		String redisCode = String.valueOf(redisUtil.get(CacheNames.CAPTCHA_KEY + key));
		// 判断验证码
		if (code == null || !StringUtil.equalsIgnoreCase(redisCode, code)) {
			throw new ServiceException(TokenUtil.CAPTCHA_NOT_CORRECT);
		}

		String tenantId = tokenParameter.getArgs().getStr("tenantId");
		String account = tokenParameter.getArgs().getStr("account");
		String password = tokenParameter.getArgs().getStr("password");
		UserInfo userInfo = null;
		if (Func.isNoneBlank(account, password)) {
			// 获取用户类型
			String userType = tokenParameter.getArgs().getStr("userType");
			R<UserInfo> result;
			// 根据不同用户类型调用对应的接口返回数据,用户可自行拓展
			if (userType.equals(BladeUserEnum.WEB.getName())) {
				result = userClient.userInfo(tenantId, account, DigestUtil.encrypt(password));
			} else if (userType.equals(BladeUserEnum.APP.getName())) {
				result = userClient.userInfo(tenantId, account, DigestUtil.encrypt(password));
			} else {
				result = userClient.userInfo(tenantId, account, DigestUtil.encrypt(password));
			}
			userInfo = result.isSuccess() ? result.getData() : null;
		}
		return userInfo;
	}

}

(2)、校验密码

public class PasswordTokenGranter implements ITokenGranter {

	public static final String GRANT_TYPE = "password";

	private IUserClient userClient;

	@Override
	public UserInfo grant(TokenParameter tokenParameter) {
		String tenantId = tokenParameter.getArgs().getStr("tenantId");
		String account = tokenParameter.getArgs().getStr("account");
		String password = tokenParameter.getArgs().getStr("password");
		UserInfo userInfo = null;
		if (Func.isNoneBlank(account, password)) {
			// 获取用户类型
			String userType = tokenParameter.getArgs().getStr("userType");
			R<UserInfo> result;
			// 根据不同用户类型调用对应的接口返回数据,用户可自行拓展
			if (userType.equals(BladeUserEnum.WEB.getName())) {
				result = userClient.userInfo(tenantId, account, DigestUtil.encrypt(password));
			} else if (userType.equals(BladeUserEnum.APP.getName())) {
				result = userClient.userInfo(tenantId, account, DigestUtil.encrypt(password));
			} else {
				result = userClient.userInfo(tenantId, account, DigestUtil.encrypt(password));
			}
			userInfo = result.isSuccess() ? result.getData() : null;
		}
		return userInfo;
	}

}

3、定义接口实现类的创建

public class TokenGranterBuilder {

	/**
	 * TokenGranter缓存池
	 */
	private static Map<String, ITokenGranter> granterPool = new ConcurrentHashMap<>();
	//先创建所有实现类的实例放进map中
	static {
		granterPool.put(PasswordTokenGranter.GRANT_TYPE, SpringUtil.getBean(PasswordTokenGranter.class));
		granterPool.put(CaptchaTokenGranter.GRANT_TYPE, SpringUtil.getBean(CaptchaTokenGranter.class));
		granterPool.put(RefreshTokenGranter.GRANT_TYPE, SpringUtil.getBean(RefreshTokenGranter.class));
	}

	/**
	 * 获取TokenGranter
	 *
	 * @param grantType 授权类型
	 * @return ITokenGranter
	 */
	public static ITokenGranter getGranter(String grantType) {
		//根据前端传的类型返回不同的实例
		ITokenGranter tokenGranter = granterPool.get(Func.toStr(grantType, PasswordTokenGranter.GRANT_TYPE));
		if (tokenGranter == null) {
			throw new SecureException("no grantType was found");
		} else {
			return tokenGranter;
		}
	}

}

4、调用类

public class AuthController {

	private RedisUtil redisUtil;

	@PostMapping("token")
	public R<AuthInfo> token(String grantType,String refreshToken,String tenantId, String account,String password) {
		String userType = Func.toStr(WebUtil.getRequest().getHeader(TokenUtil.USER_TYPE_HEADER_KEY), TokenUtil.DEFAULT_USER_TYPE);

		TokenParameter tokenParameter = new TokenParameter();
		tokenParameter.getArgs().set("tenantId", tenantId)
			.set("account", account)
			.set("password", password)
			.set("grantType", grantType)
			.set("refreshToken", refreshToken)
			.set("userType", userType);
		//通过构造器获取实例,这里就是根据类型返回的实例
		ITokenGranter granter = TokenGranterBuilder.getGranter(grantType);
		UserInfo userInfo = granter.grant(tokenParameter);

		if (userInfo == null || userInfo.getUser() == null || userInfo.getUser().getId() == null) {
			return R.fail(TokenUtil.USER_NOT_FOUND);
		}

		return R.data(TokenUtil.createAuthInfo(userInfo));
	}
TM1621/HT1621 段码LCD驱动器 TM1621 LCD 驱动器 阅读详情

相关推荐

图像配准方法之灰度信息法

这系列文章是5年前的,也是从自己的QQ(632846506)日志中移过来的。https://user.qzone.qq.com/632846506/infocenter。      图像配准的方法主要有三种:基于灰度信息方法;基于空间变换域方法;基于图像特征的方法。 一、灰度信息法。     灰度信息法直接利用两幅图像之间灰度度量的相似性,以图像内部的信息为依据,采用搜索方法寻找相似度最大或

月秀明竹的专栏 1万+

java一个接口多个实现得调用

需要根据具体的应用场景和需求选择适合的方式来调用不同的实现类。在代码中,根据接口类型、条件判断、集合遍历或动态获取实例等方式,可以灵活地调用不同的实现类的方法。

yuanchengfu0910的博客 9952

IP白名单校验

支持格式: 1、127.0.0.1 // 指定固定IP 2、127.0.0.1-127.0.0.128 // 可使用“-”来表示一个IP区间,支持跨IP段(一般不会出现这种情况,跨IP段则配置多个规则) 3、127.0.* // 2~4位IP段可...

2199

Java基础2

weixin_42082952的博客 1157

单细胞基因可视化之热图的根本改造2

我们前面已经说过了单细胞marker/或者其他任意基因的热图的简单修饰(单细胞基因可视化之热图改造修饰1),仅仅是基于颜色和DoHeatmap函数的参数修饰。那么要对热图进行根本的改造,关键点在于提取表达矩阵,然后对分组进行注释,就可以使用heatmap或者ComplexHeatmap来做图了。 首先计算marker基因,然后选择自己需要展示的基因。 library(Seurat) library(stringr) library(dplyr) all.markers <- Find

qq_42090739的博客 6675

2026年7月19日 从可插拔到共封装:技术路线研究报告

AI 算力的爆发正在重写数据中心光互连的技术路线。本报告对当前并存的四代光互连架构——

weixin_51184047的博客 582

java中接口多个实现类,如何指定实现类,根据子类类型选择实现方法

在Java代码中,一个接口有多个实现的情况下,我们可以通过判断参数的子类类型来选择正确的实现方法。使用instanceof关键字可以判断一个对象是否是某个类的实例,从而选择正确的实现方法。

木头大左的博客 3105

【目标跟踪】基于Kalman滤波实现无人机运动轨迹跟踪附matlab代码

1 简介 在近代控制中,需要对某一特定的运动目标进行跟踪监测,并需要对其下一时间的运动位置,运动方向,速度等信息进行预先估算,才能达到对目标的即时控制.本文简要讨论了用卡尔曼滤波算法对单个目标航迹进行预测,并借助于Matlab仿真工具,对实验的效果进行评估. 2 部分代码 clc; close all; %initial state xo=25; vox=2; %Observations **** % X-Direction Calcula

qq_59747472的博客 4731

一个接口有多个实现类时,调用接口时,如何判定调用的哪个实现类?

一个接口有多个实现类时,调用接口时,如何判定调用的哪个实现类?这里有三种方法解决

Binary_huang的简介 7161

数据资产可视化分析:PowerBI在大数据管理中的实战

目的:帮你搞懂“为什么数据资产需要可视化?”“PowerBI能帮企业解决什么问题?”,并掌握用PowerBI做大数据可视化的实战技巧。范围:覆盖数据资产定义、可视化分析原理、PowerBI核心功能(数据连接、建模、可视化)、零售企业实战案例,以及未来趋势与挑战。背景:为什么企业的数据像乱堆的玩具?核心概念:数据资产、可视化分析、PowerBI分别是什么?它们怎么配合?实战步骤:用PowerBI帮零售企业整理“销售玩具箱”,做出能指导决策的仪表盘;应用场景:不同部门怎么用这个“整理好的玩具箱”?

2501_92132293的博客 906

10步掌握!跨国企业在MySQL中实现数据主权的秘诀 vs. 传统方法,你选对了吗?

首先,我们要明确“数据主权”这一概念。简单来说,它指的是国家对其境内产生的所有类型的数据拥有绝对控制权。这意味着即使数据被存储在国外服务器上,只要该数据来源于某国,那么该国政府就有权对其进行监管。对于跨国公司来说,这就要求它们必须严格遵循不同国家关于数据保护的规定,如欧盟的GDPR、美国的《云法案》以及中国的《网络安全法》等。

java专栏 713

java 接口多个实现类_如何使用具有多个实现类的java接口

public interface Foo {}public class SpecificFoo implements Foo {}public interface SomeInterface {void thisMethod(Foo someKindOfFoo);}public class SomeClass implements SomeInterface {public void thisMe...

weixin_39593277的博客 1894

【DRAM存储器四十七】LPDDR5介绍--LPDDR5的低功耗技术之DVFS

讲述LPDDR5的DVFSC和DVFSQ的工作原理和要求

highman110的博客 897

JAVA中一个接口多个实现类时如何判定。

例子: 1. 直接new一个实例,这样肯定知道用的哪个实例 2. 定义接口类型的变量,用某个实例去初始化。。。这样也是肯定知道用的哪个实例 一般我们用第二种方式有一个好处,如果以后要改动,那么只需要修改其引用的实例,改动较少! 举个例子:A接口,A1,A2,A3实现A接口,有一个eat方法,A1:吃饭,A2:吃鱼,A3:吃肉 需要得到"吃肉",那么 A a = new A3(); 需要得到...

ToDreamOfPeple的专栏 9663

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

一个接口有多个实现类,当调用接口中的方法时,如何判定用的是哪个实现类

一、简单例子: 1.直接new一个实例,这样肯定知道用的哪个实例 2.定义接口类型的变量,用某个实例去初始化。。。这样也是肯定知道用的哪个实例 一般我们用第二种方式有一个好处,如果以后要改动,那么只需要修改其引用的实例,改动较少! 举个例子:A接口,A1,A2,A3实现A接口,有一个eat方法,A1:吃饭,A2:吃鱼,A3:吃肉 需要得到"吃肉",那么Aa=newA3(); ...

JackLiu16的博客 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

java根据不同类型返回相应的实现类

前言 最近项目,需要根据不同的数据源类型来对数据库进行操作。我在一个接口定义了数据源应该有的操作(如:获取schema,获取某个库下的所有表) 由于实现的方法,每种类型的数据源都不太一样。比方说mysql数据预览的sql是用limit来限制返回条数,而oracle用rownum来做。这里根据数据源类型来返回具体的实现类。踩了一些雷也在这里记录一下。 1.开始指定接口及实现类 public interface DbService<T> { String getType();

c4each的博客 5100

接口实现类的动态调用

自动建表引擎,需要根据不同的数据库类型,选择数据库的实现类,进行建表操作

weixin_44831871的博客 511

创建线程的几种方式?8 年 Java 开发:从业务场景到代码实战(附避坑指南)

作为一名摸爬滚打 8 年的 Java 开发,从刚入行时 “new Thread () 一把梭”,到后来电商高并发场景下 “线程池参数调优到凌晨”,再到现在微服务异步链路用 “CompletableFuture 链式调用”,创建线程的方式选不对,不仅会踩坑(比如 OOM、线程泄露),还会直接影响系统性能。

Minoz_wl的博客 1603

java基础: Java List接口实现类深度解析:从底层原理到实战优化

List作为Java集合框架中最常用的接口之一,提供了有序、可重复的元素存储能力,其各类实现类在不同场景下展现出截然不同的性能特性。对于资深Java工程师而言,理解List接口实现类的底层设计、性能边界及适用场景,是编写高效代码的基础,也是大厂面试考察的核心能力。本文将系统解析List接口的主要实现类,从数据结构到实战应用,全方位呈现其技术细节。

weixin_43290370的博客 698

Java List 完全指南:从接口特性到四大实现类深度解析

ArrayList:性能均衡,适合大多数场景;LinkedList:适合频繁增删的场景;:适合并发读多写少的场景;Vector:尽量避免使用,仅兼容旧代码。选择时需根据 “访问效率、修改频率、并发场景” 三大维度权衡。

2201_75355172的博客 1046

java实现秒杀业务之通用缓存key封装(接口、抽象类、实现类的区别)

第一步:书写接口 package com.jack.seckill.redis; public interface KeyPrefix { public int expireSeconds(); public String getPrefix(); } 第二步:书写抽象类 package com.jack.seckill.redis; public abstra...

Richard_666的博客 475

【Java基础|第二十二篇】集合与集合框架(二)——List接口与它的实现类

List接口是Java集合框架中常用的有序集合,具有索引访问和允许重复元素的特点。主要实现类包括ArrayList(基于数组,查询快增删慢)、LinkedList(基于链表,增删快查询慢)和Vector(线程安全数组)。List提供了丰富的操作方法,包括元素获取(get)、替换(set)、添加(add)、移除(remove)等。其中ArrayList适合查询频繁的场景,LinkedList适合频繁增删的场景。此外还介绍了常见数据结构特点,如数组的随机访问、链表的动态增删、栈的后进先出等。不同的数据结构适用于

m0_74177281的博客 1096

java如何在不同的业务场景下使用最适合的Map接口使得代码效率达到最大化?

Java中的Map接口是一个用于存储键值对的集合。HashMap:基于哈希表实现,提供常数时间的性能用于基本操作(如插入、删除和查找)。:继承自HashMap,维护插入顺序,适合需要有序遍历的场景。TreeMap:基于红黑树实现,提供有序的键值对,适合需要排序的场景。:线程安全的HashMap实现,适合多线程环境下的并发操作。在Java业务代码中,正确选择和使用不同的Map集合可以显著提高程序的性能和可读性。通过了解每种Map实现的特点和适用场景,我们可以在实际开发中做出更明智的选择。

梦在硅谷的博客 1060

Java中的Collection集合以及Collection集合实现类实例

集合概述 集合的体系特点 Collection集合常用API Collection集合的遍历方式 方式一:迭代器 方式二:foreach/增强for循环 方式三:lambda表达式 Collection集合存储自定义类型的对象 List系列集合 List集合特点、特有API List集合的遍历方式小结 ArrayList集合的底层原理 LinkedList集合的底层原理 ......

qq_43751200的博客 2208

Set有哪些实现类?区别是什么?

在 Java 中, 接口的常用实现类主要有 HashSet、LinkedHashSet 和 TreeSet。它们的核心区别体现在 底层数据结构、元素顺序性、性能 和 适用场景 上。以下是详细对比:底层实现:基于 (哈希表 + 链表/红黑树,Java 8+ 优化)。元素特性:无序:不保证插入顺序或自然顺序。允许 值:可存储一个 元素。性能:时间复杂度:添加()、删除()、查询()均为 (平均)。哈希冲突:冲突严重时(链表过长),会转为红黑树(Java 8+),查询退化为 。适用场景:快速去重,不关心顺序。

looken1024的博客 760

88面试常问:你能说说 Spring 中,接口的bean是如何注入的吗?

问: 这个问题困扰了我好久,一直疑问这个接口的bean是怎么注入进去的?因为只看到使用@Service注入了实现类serviceImpl,使用时怎么能获取的接口,而且还能调用到实现类的方法,难道这个接口是在什么时候自动注入了进去,且和实现类关联上了? 接口 publicinterfaceTestService{ publicStringtest(); } 实现类impl @Service publicclassTestServiceImplimplemen...

AI乔治 457

利用枚举来实现工厂模式,多态的实现。多个实现类实现一个接口的各个方法。枚举的用法

3.2这里面有个执行类,定义了该接口,去执行接口的方法。3.1 所有的实现类都会注入到该类,供switch匹配。

鹏神丶明月天 872
上一篇: java后台实现Excel的导出:easypoi实现
下一篇: Java8特性:lambda表达式
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值