设计模式——适配器模式

适配器模式(Adapter Pattern)是一种结构设计模式。

目的:这种模式通常用于使已经存在的类在不修改其源代码的情况下与其他类进行协作。

实现方法:在不修改原有类的基础上,创建一个新类,继承原有类,重写原有接口或者新增方法接口。

原有类是被适配者,适配器是继承原有类的类。

在原有类上新增方法的示例

cpp 复制代码
// 目标接口
interface Target {
    void request();
}

// 被适配者
class Adaptee {
    void specificRequest() {
        System.out.println("Adaptee's specific request");
    }
}

// 适配器
class Adapter extends Adaptee implements Target {
    @Override
    public void request() {
        specificRequest();
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        Target target = new Adapter();
        target.request();
    }
}

修改原有类的方法的示例

在Netty中,适配器模式通常用于处理事件驱动的编程模型。Netty中使用了一种基于事件的设计,其中适配器模式可以很好地体现在处理不同类型的事件上。一个常见的例子是ChannelHandler适配器。

Netty的ChannelHandler是用于处理事件的接口,而ChannelHandlerAdapter是一个抽象类,实现了ChannelHandler接口的所有方法。开发者可以选择性地继承ChannelHandlerAdapter并重写感兴趣的方法,而不是实现ChannelHandler中的所有方法。

cpp 复制代码
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

// 自定义适配器
public class CustomHandlerAdapter extends ChannelInboundHandlerAdapter {

    // 重写需要处理的事件方法
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
        // 处理读事件
        System.out.println("Received message: " + msg);
        // 其他业务逻辑...
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        // 处理异常事件
        cause.printStackTrace();
        ctx.close();
    }
}

这个例子展示了适配器模式在Netty中的一种常见使用场景。在Netty的事件驱动模型中,ChannelHandler和ChannelHandlerAdapter之间的关系就体现了适配器模式。

适配器模式的主要使用场景

  • 不变动原有类的基础上,给原有类添加方法接口

  • 不变动原有类的基础上,修改原有类的方法的实现

在Netty中,ChannelHandler接口定义了一系列的事件处理方法,而ChannelHandlerAdapter提供了这些方法的默认实现。这样,开发者只需要关注自己感兴趣的事件,选择性地覆盖相应的方法,从而实现自定义的业务逻辑,而无需关心其他方法。这就是适配器模式在Netty中的应用,它使得事件处理更加灵活、可定制。

相关推荐
互联网全栈架构18 分钟前
遨游Spring AI:第一盘菜Hello World
java·人工智能·后端·spring
优秀的颜1 小时前
计算机基础知识(第五篇)
java·开发语言·分布式
BillKu1 小时前
Java严格模式withResolverStyle解析日期错误及解决方案
java
网安INF1 小时前
ElGamal加密算法:离散对数难题的安全基石
java·网络安全·密码学
AWS官方合作商2 小时前
在CSDN发布AWS Proton解决方案:实现云原生应用的标准化部署
java·云原生·aws
gadiaola3 小时前
【JVM】Java虚拟机(二)——垃圾回收
java·jvm
coderSong25686 小时前
Java高级 |【实验八】springboot 使用Websocket
java·spring boot·后端·websocket
Mr_Air_Boy7 小时前
SpringBoot使用dynamic配置多数据源时使用@Transactional事务在非primary的数据源上遇到的问题
java·spring boot·后端
豆沙沙包?7 小时前
2025年- H77-Lc185--45.跳跃游戏II(贪心)--Java版
java·开发语言·游戏
年老体衰按不动键盘8 小时前
快速部署和启动Vue3项目
java·javascript·vue