java-接口 2

### 7. 接口的设计原则

#### 7.1 接口隔离原则(ISP)

接口隔离原则(Interface Segregation Principle, ISP)建议将大的接口分解为多个小接口,每个接口只包含客户所需的方法。这使得实现类

只需实现其真正需要的接口,避免了实现不必要的方法,提高了系统的灵活性和可维护性。

#### 接口隔离原则的示例

```java
interface Printer {
    void print();
}

interface Scanner {
    void scan();
}

interface Fax {
    void fax();
}

class MultiFunctionPrinter implements Printer, Scanner, Fax {
    @Override
    public void print() {
        System.out.println("Printing...");
    }

    @Override
    public void scan() {
        System.out.println("Scanning...");
    }

    @Override
    public void fax() {
        System.out.println("Faxing...");
    }
}

class SimplePrinter implements Printer {
    @Override
    public void print() {
        System.out.println("Printing...");
    }
}
```

在上述代码中,`Printer`、`Scanner`和`Fax`接口分别定义了打印、扫描和传真功能。`MultiFunctionPrinter`类实现了所有这些接口,而`SimplePrinter`类只实现了打印功能。这种设计符合接口隔离原则,使得每个类只实现其所需的功能。

### 8. 接口的实际应用

#### 8.1 回调机制

接口常用于实现回调机制,使得对象可以调用另外一个对象的方法。例如,事件处理和监听器机制广泛使用接口。

```java
interface ClickListener {
    void onClick();
}

class Button {
    private ClickListener listener;

    public void setClickListener(ClickListener listener) {
        this.listener = listener;
    }

    public void click() {
        if (listener != null) {
            listener.onClick();
        }
    }
}

class MyClickListener implements ClickListener {
    @Override
    public void onClick() {
        System.out.println("Button clicked!");
    }
}

public class Main {
    public static void main(String[] args) {
        Button button = new Button();
        button.setClickListener(new MyClickListener());
        button.click(); // 输出:Button clicked!
    }
}
```

在上述代码中,`ClickListener`接口定义了`onClick`方法。`Button`类通过`setClickListener`方法设置监听器,在按钮被点击时调用监听器的`onClick`方法。`MyClickListener`类实现了`ClickListener`接口,提供了具体的点击处理逻辑。

#### 8.2 策略模式

策略模式是一种行为型设计模式,它定义了一系列算法,将每个算法封装起来,并使它们可以互换。策略模式使用接口来定义算法的行为。

```java
interface PaymentStrategy {
    void pay(int amount);
}

class CreditCardPayment implements PaymentStrategy {
    @Override
    public void pay(int amount) {
        System.out.println("Paid " + amount + " using credit card.");
    }
}

class PayPalPayment implements PaymentStrategy {
    @Override
    public void pay(int amount) {
        System.out.println("Paid " + amount + " using PayPal.");
    }
}

class ShoppingCart {
    private PaymentStrategy paymentStrategy;

    public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    public void checkout(int amount) {
        paymentStrategy.pay(amount);
    }
}

public class Main {
    public static void main(String[] args) {
        ShoppingCart cart = new ShoppingCart();

        cart.setPaymentStrategy(new CreditCardPayment());
        cart.checkout(100); // 输出:Paid 100 using credit card.

        cart.setPaymentStrategy(new PayPalPayment());
        cart.checkout(200); // 输出:Paid 200 using PayPal.
    }
}
```

在上述代码中,`PaymentStrategy`接口定义了支付方法。不同的支付方式(如`CreditCardPayment`和`PayPalPayment`)实现了该接口。`ShoppingCart`类通过设置不同的支付策略,灵活地选择支付方式。

#### 8.3 依赖注入

依赖注入是一种设计模式,用于将对象的创建和依赖管理交给外部容器。接口在依赖注入中起到了关键作用,使得对象之间通过接口进行交互,降低耦合度。

```java
interface Service {
    void execute();
}

class ServiceImpl implements Service {
    @Override
    public void execute() {
        System.out.println("Service executed.");
    }
}

class Client {
    private Service service;

    public Client(Service service) {
        this.service = service;
    }

    public void doSomething() {
        service.execute();
    }
}

public class Main {
    public static void main(String[] args) {
        Service service = new ServiceImpl();
        Client client = new Client(service);
        client.doSomething(); // 输出:Service executed.
    }
}
```

在上述代码中,`Service`接口定义了服务的行为,`ServiceImpl`类实现了该接口。`Client`类通过构造函数接受`Service`接口的实现,从而实现依赖注入。

### 9. 接口的优缺点

#### 优点

1. **解耦合**:接口定义了类的行为契约,减少了实现类之间的依赖,从而降低了代码的耦合度。
2. **灵活性**:接口支持多重实现,一个类可以实现多个接口,从而具备多种行为。
3. **可扩展性**:接口使得系统具有良好的扩展性,可以方便地添加新的实现类而不影响现有代码。
4. **多态性**:接口支持多态性,不同的实现类可以通过相同的接口进行操作,提高了代码的灵活性。

#### 缺点

1. **接口的滥用**:过度使用接口可能导致代码的复杂性增加,特别是在不必要的地方使用接口,会使代码变得难以理解和维护。
2. **性能开销**:由于接口方法是动态绑定的,相较于静态绑定的方法调用,可能会有一些性能开销。
3. **额外的开发工作**:每个接口需要一个或多个实现类,可能会增加开发工作量。

### 10. 总结

接口是Java中非常重要的抽象机制,用于定义类的行为契约和能力。通过接口,可以实现多态性、多重继承和解耦合,提高代码的灵活性和可维护性。接口在设计模式中也有广泛的应用,如回调机制、策略模式和依赖注入等。

理解接口的概念、特性和使用场景,并根据具体需求合理设计和使用接口,是编写高质量Java代码的关键。在实际开发中,应遵循接口隔离原则,避免接口的滥用,确保系统的可维护性和扩展性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/715032.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机组成原理之定点运算器的组成

文章目录 定点运算器的组成逻辑运算ALU两级先行进位的ALU 总线单总线结构双总线结构三总线结构 定点运算器的组成 逻辑运算 总的来说,逻辑非运算就是按位取反;逻辑加运算就是按位取或运算;逻辑乘运算就是按位取和运算;逻辑异运算…

2-6 基于matlab2018B的语音信号降噪和盲源分离GUI界面

基于matlab2018B的语音信号降噪和盲源分离GUI界面,包括维纳滤波,小波降噪、高通、低通、带通滤波,及提出的滤波方法。每个功能均展示降噪前后声音效果并外放出来。程序已调通,可直接运行。 2-6 语音信号降噪 盲源分离 GUI界面 - 小…

UML相关2

内容 说明 用例编号 UC-1 用例名称 客户注册 用例说明 客户参与者通过注册获得进入彬使用系统的权限 参与者 客户 前置条件 无 后置条件 系统正确接收用户信息并保存到数据库 基本路径 发布注册申请系统显示注册页面客户填写相应信息并提交注册成功后可以进行其…

贷款投资决策和常用财务函数

前段时间上了一门excel操作的课,本文结合其中介绍财务函数以及投资决策分析相关的部分,对贷款中的现金流计算进行深入的分析。 以等额本息产品为例进行实操计算,假设某产品本金12000元,期限12,IRR利率24%。每期还款113…

生信分析进阶5 - 全外显子组变异检测和ANNOVAR注释Snakemake分析流程

基于yaml或ini配置文件,配置文件包含例如样本名称、参考基因组版本、exon capture bed文件路径、参考基因组路径和ANNOVAR注释文件等信息。 基于该流程可以实现全外显测序的fastq文件输入到得到最终变异VCF文件。 1. Snakemake分析流程基础软件安装 # conda安装 …

面试题 17.17. 多次搜索

链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a; class Solution { private:struct Trie {Trie() {end false;index -1;next.resize(26);}bool end;int index;std::vector<std::unique_ptr<Trie>> next;};void insert_trie(int in…

C++编程:vector容器的简单模拟实现

前言&#xff1a; 在C标准库&#xff08;STL&#xff09;中&#xff0c;vector容器是最常见使用的动态数组。它结合了链表与数组的优点&#xff0c;提供了灵活的大小调整与高效的随机访问。本文将简单的对vector容器进行介绍并且对vector容器简单的模拟实现。 一、vector的文…

web前端:作业三

1.回到顶部案例(固定定位) <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>#container{height: 5000px;border: 1px solid blue;}#back-button{width: 100px;height: 100px;border: 1px solid…

Redis分布式锁的实现、优化与Redlock算法探讨

Redis分布式锁最简单的实现 要实现分布式锁,首先需要Redis具备“互斥”能力,这可以通过SETNX命令实现。SETNX表示SET if Not Exists,即如果key不存在,才会设置它的值,否则什么也不做。利用这一点,不同客户端就能实现互斥,从而实现一个分布式锁。 举例: 客户端1申请加…

比亚迪智驾技术震撼登场!L3级自动驾驶领跑全国,无图导航、夜间挑战轻松应对!

作为新能源汽车领域的翘楚&#xff0c;比亚迪在电池技术与智能驾驶方面都有着卓越的表现。近日&#xff0c;比亚迪凭借其领先的智驾技术&#xff0c;成功入选全国首批L3级自动驾驶上路及行驶试点名单&#xff0c;这无疑将推动智驾技术的普及速度。 你知道吗&#xff1f;比亚迪智…

Elasticsearch 认证模拟题 - 22

一、题目 索引 task 索引中文档的 fielda 字段内容包括了 hello & world&#xff0c;索引后&#xff0c;要求使用 match_phrase query 查询 hello & world 或者 hello and world 都能匹配该文档 1.1 考点 分词器 1.2 答案 # 创建符合条件的 task 索引&#xff0c;…

SM2加密算法的公私钥和密文格式以及不同编程语言之间无法互相解密问题分析

1 文章介绍 本文章主要介绍了SM2加密算法的公钥、私钥和密文格式,以及对于不同编程语言之间无法互相解密问题进行了分析和处理。2 SM2加密算法格式 SM2在线加解密测试2.1 公钥格式 SM2公钥是SM2曲线上的一个点,由横、纵坐标两个分量来表示,简记为Q,每个分量长度为256位,即…

Apipost模拟HTTP客户端

模拟HTTP客户端的软件有很多&#xff0c;其中比较著名的就有API-FOX、POSTMAN。 相信很多小伙伴都使用POSTMAN。这篇博客主要介绍Apipost的原因是&#xff0c;Apipost无需下载&#xff0c;具有网页版。 APIFOX的站内下载&#xff1a; Api-Fox&#xff0c;类似于PostMan的软件…

[力扣二叉树]本地调试环境指导手册

以236. 二叉树的最近公共祖先为例子 本地编译软件为Viusal Studio 2022 写代码 项目里文件位置 CreateTree.h #pragma once #ifndef CLIONPROJECT_LEETCODECREATETREE_H #define CLIONPROJECT_LEETCODECREATETREE_H #include<vector> #include<queue> using na…

Java语法和基本结构介绍

Java语法和基本结构是Java编程的基础&#xff0c;它决定了Java代码的书写方式和程序的结构。以下是Java语法和基本结构的一些关键点&#xff1a; 1.标识符和关键字&#xff1a;Java中的标识符是用来标识变量、函数、类或其他用户自定义元素的名称。关键字是预留的标识符&#x…

【Netty】ByteBuffer原理与使用

Buffer则用来缓冲读写数据&#xff0c;常见的buffer有&#xff1a; ByteBuffer MappedByBuffer DirectByteBuffer HeapByteBuffer hortBuffer IntBuffer LongBuffer FloatBuffer DoubleBuffer CharBuffer 有一个普通文本文件data.txt,内容为&#xff1a; 1234567890a…

Spring Boot实战:图书信息网站

实战概述&#xff1a;Spring Boot图书信息网站开发 项目背景 随着数字化时代的到来&#xff0c;图书信息网站为用户提供了一个便捷的在线浏览和购买图书的平台。本实战项目旨在通过Spring Boot框架开发一个图书信息网站&#xff0c;实现图书展示、用户登录和管理等功能。 项…

MySQL数据库(三)

一.MySQL数据库学习(三) (一).数据表的约束 为防止错误的数据被插入到数据表&#xff0c;MySQL中定义了一些维护数据库完整性的规则&#xff1b;这些规则常称为表的约束。 约束条件说明PRIMARY KEY主键约束用于唯一标识对应的记录FOREIGN KEY外键约束NOT NULL非空约束UNIQUE…

牛客 第二十届西南科技大学ACM程序设计竞赛(同步赛):祖玛

题目描述 wzy 在玩一种很新的祖玛。 给定一个仅包含 小写字母 的字符串 sss , sss 由 mmm 个不同的小写字母组成&#xff0c;每个字母代表一种小球&#xff0c;在消去时会获得 相应 的分数&#xff1a; 两个及以上 相同的小球相碰就会消失&#xff08;在发射小球前因为无相碰&…

Excel中多条件判断公式怎么写?

在Excel里&#xff0c;这种情况下的公式怎么写呢&#xff1f; 本题有两个判断条件&#xff0c;按照题设&#xff0c;用IF函数就可以了&#xff0c;这样查看公式时逻辑比较直观&#xff1a; IF(A2>80%, 4, IF(A2>30%, 8*(A2-30%),0)) 用IF函数写公式&#xff0c;特别是当…