package com.liuxing.adapter;
import com.sun.corba.se.spi.oa.ObjectAdapter;
/**
-
@ClassName Test
-
@Description 测试
-
@Author: 流星007
-
@Date 2021/4/27 13:56
*/
public class Test {
public static void main(String[] args) {
//类适配器
ITarget classAdaptor = new MyClassAdaptor();
classAdaptor.doSomthing1();
classAdaptor.doSomthing2();
classAdaptor.doSomthing3();
System.out.println(“============================”);
//对象适配器
ITarget objectAdaptor = new MyObjectAdaptor(new MyAdaptee());
objectAdaptor.doSomthing1();
objectAdaptor.doSomthing2();
objectAdaptor.doSomthing3();
}
}
-
ITarget:表示需要转接成的接口定义。
-
MyAdaptee:是不兼容 ITarget 接口定义的接口。
-
MyClassAdaptor:将 Adaptee 转化成一组符合 ITarget 接口定义的接口(类适配器)。
-
MyObjectAdaptor:将 Adaptee 转化成一组符合 ITarget 接口定义的接口(对象适配器)。
-
Test:测试类
输出结果如下
这是 todo1
我是被重新实现的dosomthing2
这是 todo3
============================
这是 todo1
我是被重新实现的dosomthing2
这是 todo3
Process finished with exit code 0
这两种实现方式都比较的巧妙,如果看不太明白的话可以结合着实际的应用场景再试试,个人觉得还是没有那么难理解,不过现在还有一个问题需要我们进一步分析,是什么呢?什么时候使用类适配器,什么时候使用对象适配器呢?我们都说组合优于继承,当然是优先选择对象适配器啦,千万不要有这种想法,虽然组合优于继承,但这并不能说明任何情况组合都比继承适用,那我们如何来判断这两种实现方式呢?
标准主要有两个,第一个是 MyAdaptee 的接口个数,第二个则是 MyAdaptee 与 ITarget 的契合程度。这怎么理解呢?
- MyAdaptee 接口较少,类适配器和对象适配器两者任选其一即可。
- MyAdaptee 接口很多,但是大部分的接口 都是与 ITarget 相同,只是少部分存在区别,那么推荐使用类适配器(继承实现),改动代码量相对于对象适配器来说较少。
- MyAdaptee 接口很多,并且大部分的接口都不相同,这个时候推荐使用对象适配器(组合实现),因为组合比继承更加的灵活。
========================================================================
适配器模式的应用场景还是比较多的,但是这种设计模式多用于补救,当程序设计出现问题,升级改变较大时,需要一个类似适配器的东西将他们连接起来,所以我们在正常的开发中使用这种模式的机会还是不多的,也希望同学们设计的程序都是很稳定,不会用到适配器来做补救。
-
敏感词过滤
-
升级兼容
-
架构设计缺陷
-
Slf4j日志打印
-
外部依赖
应用场景太多,我拿敏感词过滤来做一个demo说明吧,敏感词大家应该都了解过,玩游戏的时候如果有一个队友超鬼了,那么其他队友就会对他进行亲切的问候,这个时候有些太过优雅的词会被 ”**“ 代替,这个就是我们说的敏感词过滤。
假设我们系统一共有三家敏感词过滤的厂商,但是他们的接口标准都不相同,一般的写法是什么样的呢?上代码
package com.liuxing.adapter.demo;
import org.apache.commons.lang3.ObjectUtils;
import java.util.ArrayList;
import java.util.List;
/**
-
@ClassName AliSensitiveWordFilter
-
@Description 某里云过滤
-
@Author liuxing007
-
@Date 2021/4/27 16:07
*/
public class AliSensitiveWordFilter {
private static final List sensitiveWords = new ArrayList<>(3);
static {
sensitiveWords.add(“垃圾”);
sensitiveWords.add(“废物”);
sensitiveWords.add(“滚”);
}
/**
-
@param filterWordVo
-
@return java.lang.String
-
@Description 过滤
-
@Date 2021/4/27 16:34
*/
public String filterWord(FilterWordVo filterWordVo) {
if (ObjectUtils.isEmpty(filterWordVo)) {
return null;
}
String repWord = filterWordVo.getRepWord();
String word = filterWordVo.getWord();
for (String sensitiveWord : sensitiveWords) {
if (word.indexOf(sensitiveWord) >= 0) {
System.out.println(“找到敏感词:” + sensitiveWord + “,直接替换”);
word = word.replaceAll(sensitiveWord, repWord);
}
}
return word;
}
}
package com.liuxing.adapter.demo;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.List;
/**
-
@ClassName DuSensitiveWordFilter
-
@Description 某度云过滤
-
@Author liuxing007
-
@Date 2021/4/27 16:07
*/
public class DuSensitiveWordFilter {
private static final List sensitiveWords = new ArrayList<>(3);
static {
sensitiveWords.add(“爸”);
sensitiveWords.add(“妈”);
sensitiveWords.add(“爷”);
}
/**
-
@param word 需要过滤的内容
-
@param repWord 需要替换成什么
-
@return java.lang.String
-
@Description 过滤
-
@Date 2021/4/27 16:34
*/
public String filterWord(String word, String repWord) {
if (StringUtils.isAllEmpty(word, repWord)) {
return null;
}
for (String sensitiveWord : sensitiveWords) {
if (word.indexOf(sensitiveWord) >= 0) {
System.out.println(“找到敏感词:” + sensitiveWord + “,直接替换”);
word = word.replaceAll(sensitiveWord, repWord);
}
}
return word;
}
}
package com.liuxing.adapter.demo;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
-
@ClassName WeiSensitiveWordFilter
-
@Description 某为云过滤
-
@Author ymy
-
@Date 2021/4/27 16:07
*/
public class WeiSensitiveWordFilter {
private static Map<Integer, String> filterMap = new HashMap<>();
private static final List sensitiveWords = new ArrayList<>(3);
static {
//将敏感词过滤为 *
filterMap.put(1, “*”);
//将敏感词过滤为空字符串
filterMap.put(2, “”);
//将敏感词过滤为 -
filterMap.put(3, “-”);
sensitiveWords.add(“干”);
sensitiveWords.add(“操”);
sensitiveWords.add(“怼”);
}
/**
-
@param word 需要过滤的内容
-
@param type 需要替换成什么
-
@return java.lang.String
-
@Description 过滤
-
@Date 2021/4/27 16:34
*/
public String filterWord(String word, Integer type) {
if (StringUtils.isEmpty(word) || type == null) {
return null;
}
String repWord = filterMap.get(type);
for (String sensitiveWord : sensitiveWords) {
if (word.indexOf(sensitiveWord) >= 0) {
System.out.println(“找到敏感词:” + sensitiveWord + “,直接替换”);
word = word.replaceAll(sensitiveWord, repWord);
}
}
return word;
}
}
package com.liuxing.adapter.demo.normal;
import com.liuxing.adapter.demo.AliSensitiveWordFilter;
import com.liuxing.adapter.demo.DuSensitiveWordFilter;
import com.liuxing.adapter.demo.FilterWordVo;
import com.liuxing.adapter.demo.WeiSensitiveWordFilter;
/**
-
@ClassName SensitiveWordFilterService
-
@Description 敏感词过滤处理
-
@Author liuxing007
-
@Date 2021/4/27 17:28
*/
public class SensitiveWordFilterService {
private AliSensitiveWordFilter aliSensitiveWordFilter = new AliSensitiveWordFilter();
private DuSensitiveWordFilter duSensitiveWordFilter = new DuSensitiveWordFilter();
private WeiSensitiveWordFilter weiSensitiveWordFilter = new WeiSensitiveWordFilter();
public String filter(String word) {
FilterWordVo filterWordVo = FilterWordVo.builder().word(word).repWord(“*”).build();
word = aliSensitiveWordFilter.filterWord(filterWordVo);
word = duSensitiveWordFilter.filterWord(word, “*”);
word = weiSensitiveWordFilter.filterWord(word, 1);
return word;
}
}
package com.liuxing.adapter.demo;
import lombok.Builder;
import lombok.Data;
/**
-
@ClassName FilterWordVo
-
@Description 敏感词过滤参数
-
@Author liuxing007
-
@Date 2021/4/27 16:09
*/
@Data
@Builder
public class FilterWordVo {
/**
*需要替换的内容
*/
private String word;
/**
*替换成什么
*/
private String repWord;
}
package com.liuxing.adapter.demo.normal;
/**
-
@ClassName Test
-
@Description 敏感词过滤测试
-
@Author liuxing007
-
@Date 2021/4/27 16:38
*/
public class Test {
public static void main(String[] args) {
SensitiveWordFilterService sensitiveWordFilterService = new SensitiveWordFilterService();
String word = sensitiveWordFilterService.filter(“你就是一个垃圾,这么菜,你妈妈没教你打游戏吗?干”);
System.out.println(“过滤后的内容:” + word);
}
}
-
AliSensitiveWordFilter:某里云过滤
-
DuSensitiveWordFilter:某度过滤
-
WeiSensitiveWordFilter:某为云过滤
-
FilterWordVo:敏感词过滤所需要的参数信息
-
SensitiveWordFilterService:敏感词过滤处理类
-
Test:测试类
一共有三家过滤敏感词的厂商,我在 SensitiveWordFilterService 类中 filter()方法分别组装了这三家厂商需要的参数,然后进行依次调用过滤,将最终的结果进行返回。这样写完全没有问题,但是这里有一个问题,那就是扩展性很差,如果我继续增加一个厂商或者删除一个厂商,我都需要去改 SensitiveWordFilterService 类中的 filter()方法,非常麻烦而且还是容出现bug,所以这个时候,就需要我们的适配器模式上场了,我们把过滤这件事情交给它,由它去对每个厂商做适配,这样,在后续改动的过程中,我就不需要平凡的去改动 SensitiveWordFilterService 类 。
适配器改造代码开始
package com.liuxing.adapter.demo.adaptor;
public interface ISensitiveWordFilter {
/**
-
@Description 过滤
-
@Date 2021/4/27 17:51
-
@param word
-
@return java.lang.String
*/
String filter(String word);
}
package com.liuxing.adapter.demo.adaptor;
import com.liuxing.adapter.demo.AliSensitiveWordFilter;
import com.liuxing.adapter.demo.FilterWordVo;
/**
-
@ClassName AliSensitiveWordFilterAdaptor
-
@Description 某里云适配类
-
@Author liuxing007
-
@Date 2021/4/27 17:52
*/
public class AliSensitiveWordFilterAdaptor implements ISensitiveWordFilter {
private AliSensitiveWordFilter aliSensitiveWordFilter = new AliSensitiveWordFilter();
@Override
public String filter(String word) {
FilterWordVo filterWordVo = FilterWordVo.builder().word(word).repWord(“*”).build();
return aliSensitiveWordFilter.filterWord(filterWordVo);
}
}
package com.liuxing.adapter.demo.adaptor;
import com.liuxing.adapter.demo.DuSensitiveWordFilter;
/**
-
@ClassName AliSensitiveWordFilterAdaptor
-
@Description 某度适配类
-
@Author liuxing007
-
@Date 2021/4/27 17:52
*/
public class DuSensitiveWordFilterAdaptor implements ISensitiveWordFilter {
private DuSensitiveWordFilter duSensitiveWordFilter = new DuSensitiveWordFilter();
@Override
public String filter(String word) {
return duSensitiveWordFilter.filterWord(word, “*”);
}
}
package com.liuxing.adapter.demo.adaptor;
import com.liuxing.adapter.demo.WeiSensitiveWordFilter;
/**
-
@ClassName AliSensitiveWordFilterAdaptor
-
@Description 某为适配类
-
@Author liuxing007
-
@Date 2021/4/27 17:52
*/
public class WuiSensitiveWordFilterAdaptor implements ISensitiveWordFilter {
private final WeiSensitiveWordFilter weiSensitiveWordFilter = new WeiSensitiveWordFilter();
@Override
public String filter(String word) {
return weiSensitiveWordFilter.filterWord(word, 1);
}
}
package com.liuxing.adapter.demo.adaptor;
import java.util.ArrayList;
import java.util.List;
/**
-
@ClassName AdaptorManagent
-
@Description 适配器管理
-
@Author liuxing007
-
@Date 2021/4/27 17:57
*/
public class AdaptorManagent {
private List sensitiveWordFilters = new ArrayList<>();
public void addAdaptor(ISensitiveWordFilter sensitiveWordFilter) {
sensitiveWordFilters.add(sensitiveWordFilter);
}
public String filter(String word){
for(ISensitiveWordFilter sensitiveWordFilter: sensitiveWordFilters){
word = sensitiveWordFilter.filter(word);
}
return word;
}
}
package com.liuxing.adapter.demo.adaptor;
/**
-
@ClassName AdaptorTest
-
@Description 测试
-
@Author ymy
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://img-blog.csdnimg.cn/img_convert/39b7aae3d95951b56c08192391a092bf.jpeg)
总结
对于面试,一定要有良好的心态,这位小伙伴面试美团的时候没有被前面阿里的面试影响到,发挥也很正常,也就能顺利拿下美团的offer。
小编还整理了大厂java程序员面试涉及到的绝大部分面试题及答案,希望能帮助到大家,
最后感谢大家的支持,希望小编整理的资料能够帮助到大家!也祝愿大家都能够升职加薪!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-G9NASeHh-1713554193236)]
[外链图片转存中…(img-fbRANmOn-1713554193239)]
[外链图片转存中…(img-NRKyV7dS-1713554193241)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://img-blog.csdnimg.cn/img_convert/39b7aae3d95951b56c08192391a092bf.jpeg)
总结
对于面试,一定要有良好的心态,这位小伙伴面试美团的时候没有被前面阿里的面试影响到,发挥也很正常,也就能顺利拿下美团的offer。
小编还整理了大厂java程序员面试涉及到的绝大部分面试题及答案,希望能帮助到大家,
[外链图片转存中…(img-o1C9rX2F-1713554193242)]
[外链图片转存中…(img-DsrQhPio-1713554193244)]
最后感谢大家的支持,希望小编整理的资料能够帮助到大家!也祝愿大家都能够升职加薪!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!