【设计模式】适配器模式:如何巧妙地过滤游戏中的敏感词

文章详细介绍了Java中的类适配器(如MyClassAdaptor)和对象适配器(如MyObjectAdaptor)在编程中的使用,以及它们在处理接口不兼容情况下的应用。同时,通过敏感词过滤的例子展示了适配器模式如何提高代码的扩展性和灵活性。
摘要由CSDN通过智能技术生成

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 接口很多,并且大部分的接口都不相同,这个时候推荐使用对象适配器(组合实现),因为组合比继承更加的灵活。

适配器模式应用场景

========================================================================

适配器模式的应用场景还是比较多的,但是这种设计模式多用于补救,当程序设计出现问题,升级改变较大时,需要一个类似适配器的东西将他们连接起来,所以我们在正常的开发中使用这种模式的机会还是不多的,也希望同学们设计的程序都是很稳定,不会用到适配器来做补救。

  1. 敏感词过滤

  2. 升级兼容

  3. 架构设计缺陷

  4. Slf4j日志打印

  5. 外部依赖

应用场景太多,我拿敏感词过滤来做一个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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

对于面试,一定要有良好的心态,这位小伙伴面试美团的时候没有被前面阿里的面试影响到,发挥也很正常,也就能顺利拿下美团的offer。
小编还整理了大厂java程序员面试涉及到的绝大部分面试题及答案,希望能帮助到大家,

在这里插入图片描述

在这里插入图片描述

最后感谢大家的支持,希望小编整理的资料能够帮助到大家!也祝愿大家都能够升职加薪!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-G9NASeHh-1713554193236)]

[外链图片转存中…(img-fbRANmOn-1713554193239)]

[外链图片转存中…(img-NRKyV7dS-1713554193241)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

对于面试,一定要有良好的心态,这位小伙伴面试美团的时候没有被前面阿里的面试影响到,发挥也很正常,也就能顺利拿下美团的offer。
小编还整理了大厂java程序员面试涉及到的绝大部分面试题及答案,希望能帮助到大家,

[外链图片转存中…(img-o1C9rX2F-1713554193242)]

[外链图片转存中…(img-DsrQhPio-1713554193244)]

最后感谢大家的支持,希望小编整理的资料能够帮助到大家!也祝愿大家都能够升职加薪!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值