搞定设计模式之接口隔离原则一篇文章就够了!!!

一、定义

客户端不应该被迫依赖于它不使用的方法

一个类对另一个类的依赖应该建立在最小的接口上

接口隔离原则(Interface Segregation Principle,ISP)要求程序员尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含客户感兴趣的方法。

接口隔离是为了高内聚、低耦合。在实际的业务开发中,通常会先定义好需要开发的接口,并由各个服务类实现。

但如果没有经过考虑和设计,就很可能造成一个接口中包括众多的接口方法,而这些接口并不一定在每一个类中都需要实现。这样的接口很难维护,也不易于扩展,每一次修改验证都有潜在的风险

在具体应用接口隔离原则时,应该根据以下几个规则衡量:
(1)接口尽量小,但是要有限度。一个接口只服务于一个子模块或业务逻辑。
(2)为依赖接口的类定制服务。只提供调用者需要的方法,屏蔽不需要的方法。
(3)了解环境,拒绝盲从。每个项目或产品都有选定的环境因素,环境不同,接口拆分的标准就不同,要深入了解业务逻辑。
(4)提高内聚,减少对外交互。让接口用最少的方法完成最多的事情。

二、示例

《王者荣耀》里有很多英雄,可以分为射手、战士、刺客等,每个英雄有三种技能。

这些技能该如何定义,让每个英雄实现相应的技能效果呢?接下来就分别使用两种不同的方式实现,来体现设计原则的应用。

首先定义一个技能接口,实现的英雄都需要实现这个接口,进而实现自己的技能。

public interface ISkill {
    // 射箭
    void doArchery();
    // 隐袭
    void doInvisble();
    // 沉默
    void doSilent();
    // 眩晕
    void doVertigo();
}

这里提供了四个技能的接口,包括射箭、隐袭、沉默、眩晕,每个英雄都实现这个接口。

接下来实现两个英雄:后羿和廉颇。

当然,这里为了说明问题进行了简化,英雄技能只有三个,与真实游戏中有所差别。

英雄后裔:在英雄后羿的类中,实现了三个技能,最后一个眩晕的技能是不需要实现的。

public class HeroHouYi implements ISkill{

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

    @Override
    public void doInvisble() {
        System.out.println("后羿的隐身技能");
    }

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

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

英雄廉颇:在英雄廉颇的类中,同样只实现了三个技能,有一个射箭的技能没有实现。

public class HeroLianpo implements ISkill {

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

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

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

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

每个英雄的实现类里都有一个和自己无关的接口实现类,非常不符合设计模式,也不易于维护。

因为不仅无法控制外部的调用,还需要维护对应的文档,来说明这个接口不需要实现。

如果有更多这样的接口,就会变得非常麻烦。

三、问题改进

按照接口隔离原则的约定,应该在确保合理的情况下,把接口细分。保证一个松散的结构,也就是把技能拆分出来,每个英雄都可以按需继承实现。

接下来分别定义四个技能接口,包括射箭(ISkillArchery)、隐身(ISkillInvisible)、沉默(ISkillSilent)、眩晕(ISkillVertigo),如下所示。

public interface ISkillArchery {
    // 射箭
    void doArchery();
}
public interface ISkillInvisble {
    // 隐袭
    void doInvisble();
}
public interface ISkillSilent {
    // 沉默
    void doSilent();
}
public interface ISkillVertigo {
    // 眩晕
    void doVertigo();
}

有了四个技能细分的接口,英雄的类就可以自由地组合了。

英雄后羿的实现:

public class HeroHouYi implements ISkillArchery, ISkillArchery, ISkillSilent{

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

    @Override
    public void doInvisble() {
        System.out.println("后羿的隐身技能");
    }

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

英雄廉颇的实现:

public class HeroLianpo implements ISkillArchery, ISkillSilent, ISkillVertigo {
    @Override
    public void doInvisble() {
        System.out.println("廉颇的隐身技能");
    }

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

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

现在可以看到这两个英雄的类都按需实现了自己需要的技能接口。

这样的实现方式就可以避免一些本身不属于自己的技能还需要不断地用文档的方式进行维护,同时提高了代码的可靠性,在别人接手或者修改时,可以降低开发成本和维护风险。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
OpenWrt是一个基于Linux的嵌入式操作系统,用于路由器和其他嵌入式设备。它提供了丰富的功能和自定义选项,但对于一些用户来说,在配置和安装上可能稍显复杂。以下是一个简化的OpenWrt安装教程,只需要三分钟和三个简单的步骤即可完成。 第一步,准备工作。首先,确保你拥有兼容OpenWrt固件的路由器设备,并且已连接好电源和网络线。其次,访问OpenWrt官方网站,下载适用于你的路由器型号和版本的固件文件。将该文件保存到你的计算机上。 第二步,进入路由器管理界面。打开你的浏览器,并在地址栏中输入“192.168.1.1”这个默认的路由器管理IP地址。如果你的路由器IP地址有所不同,请查阅相关的资料。在登录界面输入默认的用户名和密码,通常为“root”和“admin”。登录成功后,你将进入路由器的管理页面。 第三步,安装OpenWrt固件。在路由器管理页面中,找到“系统设置”或“固件升级”等类似选项。点击“浏览”按钮,选择之前下载好的OpenWrt固件文件,并点击“安装”或“升级”按钮。等待数分钟,直到固件文件安装完成并路由器自动重启。 通过以上三个简单的步骤,你就可以完成OpenWrt的安装了。安装完成后,你可以进一步在管理界面中自定义设置、添加插件和配置网络等。请注意,在进行任何操作前,务必备份你的路由器配置和数据,以免造成不可挽回的损失。有需要时,也可以参考官方文档和社区论坛,深入了解和利用OpenWrt的更多功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南淮北安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值