IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 设计模式 接口隔离原则 -> 正文阅读

[Java知识库]设计模式 接口隔离原则


笔记来源
https://www.bilibili.com/video/BV1pY41137TB/?spm_id_from=333.788

接口隔离原则

要求程序员尽量将臃肿庞大的接口, 拆分为更小和更加具体的接口.
让接口中只包含客户感兴趣的方法.
用更小的接口 更具体的接口处理业务.

问题越小, 越容易被处理, 达到高内聚, 低耦合.

接口隔离原则代码实战

英雄联盟中, 每个英雄都有各自的一些技能
定义一个技能接口, 这个接口中有所有的技能, 不同的英雄, 去实现各自的技能.

public interface ISkill {

    void doArchery();

    void doInvisible();

    void doSilent();

    void doVertigo();
}

英雄后裔实现其拥有的技能, 没有的技能不进行实现编写.


public class HeroHouYi implements ISkill {
    public void doArchery() {
        System.out.println("后裔的灼日之矢");
    }

    public void doInvisible() {
        System.out.println("后裔的隐身技能");
    }

    public void doSilent() {
        System.out.println("后裔的沉默技能");
    }

    public void doVertigo() {
        // 无此技能的实现
    }
}

英雄廉颇也一样实现技能接口类

public class HeroLianPo implements ISkill {

    public void doArchery() {
        // 无此技能的实现

    }

    public void doInvisible() {
        System.out.println("廉颇的隐身技能");

    }

    public void doSilent() {
        System.out.println("廉颇的沉默技能");
    }

    public void doVertigo() {
        System.out.println("廉颇的眩晕技能");
    }
}

测试类

public class ApiTest {

    @Test
    public void test_ISKill() {
        // 后裔
        HeroHouYi heroHouYi = new HeroHouYi();
        heroHouYi.doArchery();

        // 廉颇
        HeroLianPo heroLianPo = new HeroLianPo();
        heroLianPo.doInvisible();
    }

}

运行结果如下 :

后裔的灼日之矢
廉颇的隐身技能

上面这么写的缺点是ISkill 接口定义了所有的技能, 太大了, 所有英雄实现此接口后, 类中会有所有的技能方法. 用接口隔离原则进行优化, 将其拆分为更小和更加具体的接口.

接口隔离原则的优化

把技能进行归类. 每一个技能, 定义一个接口.

public interface ISkillArchery {

    // 射箭
    void doArchery();

}

public interface ISkillInvisible {

    // 隐袭
    void doInvisible();
}

public interface ISkillSilent {
    // 沉默
    void doSilent();

}
public interface ISkillVertigo {
    // 眩晕
    void doVertigo();
}

后裔类去实现其拥有的技能的接口

public class HeroHouYi implements ISkillArchery, ISkillInvisible, ISkillSilent {

    public void doArchery() {
        System.out.println("后裔的灼日之矢");
    }

    public void doInvisible() {
        System.out.println("后裔的隐身技能");
    }

    public void doSilent() {
        System.out.println("后裔的沉默技能");
    }
}

廉颇类也仅仅实现其拥有的技能接口

public class HeroLianPo implements ISkillInvisible, ISkillSilent, ISkillVertigo {

    @Override
    public void doInvisible() {
        System.out.println("廉颇的隐身技能");
    }

    public void doSilent() {
        System.out.println("廉颇的沉默技能");
    }

    public void doVertigo() {
        System.out.println("廉颇的眩晕技能");
    }
}

测试类和打印结果与上面的一致.

接口隔离原则在开源框架中的应用

接口隔离原则在开源框架中的应用还是很广泛的. 经常能看到某个类, 实现了一系列的接口.
这些接口也只定义了一个方法.

例如Spring的spring-orm模块中, 有一个类AbstractEntityManagerFactoryBean
其实现的接口如下

public abstract class AbstractEntityManagerFactoryBean implements
		FactoryBean<EntityManagerFactory>, BeanClassLoaderAware, BeanFactoryAware, BeanNameAware,
		InitializingBean, DisposableBean, EntityManagerFactoryInfo, PersistenceExceptionTranslator, Serializable

其中下面这几个接口的特点都是只有一个方法, 达到了接口的隔离原则.

BeanClassLoaderAware, BeanFactoryAware, BeanNameAware,
InitializingBean, DisposableBean, PersistenceExceptionTranslator

public interface BeanClassLoaderAware extends Aware {
	void setBeanClassLoader(ClassLoader classLoader);
}
public interface BeanFactoryAware extends Aware {
	void setBeanFactory(BeanFactory beanFactory) throws BeansException;
}
public interface BeanNameAware extends Aware {
	void setBeanName(String name);
}
public interface InitializingBean {
	void afterPropertiesSet() throws Exception;
}
public interface DisposableBean {
	void destroy() throws Exception;
}
public interface PersistenceExceptionTranslator {
	DataAccessException translateExceptionIfPossible(RuntimeException ex);
}
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-13 21:36:26  更:2022-03-13 21:38:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:10:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码