设计模式六大原则(五)接口隔离原则

本文通过一个生动的例子,详细解析了设计模式中的接口隔离原则(ISP)。阐述了如何避免类依赖不必要的接口,确保每个接口专注于单一功能,提高代码的可读性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设计模式六大原则

定义:简称ISP。客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。

举例子:

给出指定食材(西红柿、黄瓜、芹菜),冷热菜师傅要根据自己的需求不同,对食材进行预处理。

先看不使用接口隔离原则,代码会什么样:

public class MadeFood {
    interface MadeFoodInter{
        void madeHot();
        void madeCold();
    }
    class Tomatoes implements MadeFoodInter{

        @Override
        public void madeHot() {
            Log.w("打印","热菜->打鸡蛋->翻炒->西红柿炒鸡蛋");
        }

        @Override
        public void madeCold() {
            Log.w("打印","冷菜->切片->加糖->搅拌->糖拌柿子");
        }
    }

    class Cucumber implements MadeFoodInter{

        @Override
        public void madeHot() {
            Log.w("打印","热菜->切肉->翻炒->黄瓜炒肉");
        }

        @Override
        public void madeCold() {
            Log.w("打印","冷菜->拍碎->加调料->搅拌->拍黄瓜");
        }
    }
    class Celery implements MadeFoodInter{

        @Override
        public void madeHot() {
            Log.w("打印","热菜->切段->炒肉->加芹菜->芹菜炒肉");
        }

        @Override
        public void madeCold() {
            Log.w("打印","冷菜->切段->焯水->加调料->凉拌芹菜");
        }
    }
    
    public MadeFoodInter getMade(String name){
        MadeFoodInter madeFoodInter = null;
        if(name.equals("西红柿")){
            madeFoodInter = new Tomatoes();
        }else if(name.equals("黄瓜")){
            madeFoodInter = new Cucumber();
        }else if(name.equals("芹菜")){
            madeFoodInter = new Celery();
        }
        return madeFoodInter;
    }
}

从上面的例子能看出来,把冷热菜需要的功能放到一个接口里之后,当热菜师傅调用接口之后,冷菜的制作方法也强制摆在热菜师傅面前,这显然是我们不应该设计出来的。
下面进行调整:

public class MadeFood {
    interface MadeHotInter{
        void madeHot();
    }
    interface MadeColdInter{
        void madeCold();
    }
    class Tomatoes implements MadeHotInter,MadeColdInter{

        @Override
        public void madeHot() {
            Log.w("打印","热菜->打鸡蛋->翻炒->西红柿炒鸡蛋");
        }

        @Override
        public void madeCold() {
            Log.w("打印","冷菜->切片->加糖->搅拌->糖拌柿子");
        }
    }

    class Cucumber implements MadeHotInter,MadeColdInter{

        @Override
        public void madeHot() {
            Log.w("打印","热菜->切肉->翻炒->黄瓜炒肉");
        }

        @Override
        public void madeCold() {
            Log.w("打印","冷菜->拍碎->加调料->搅拌->拍黄瓜");
        }
    }
    class Celery implements MadeHotInter,MadeColdInter{

        @Override
        public void madeHot() {
            Log.w("打印","热菜->切段->炒肉->加芹菜->芹菜炒肉");
        }

        @Override
        public void madeCold() {
            Log.w("打印","冷菜->切段->焯水->加调料->凉拌芹菜");
        }
    }

    public MadeHotInter getHote(String name){
        MadeHotInter madeFoodInter = null;
        if(name.equals("西红柿")){
            madeFoodInter = new Tomatoes();
        }else if(name.equals("黄瓜")){
            madeFoodInter = new Cucumber();
        }else if(name.equals("芹菜")){
            madeFoodInter = new Celery();
        }
        return madeFoodInter;
    }
    public MadeColdInter getColde(String name){
        MadeColdInter madeFoodInter = null;
        if(name.equals("西红柿")){
            madeFoodInter = new Tomatoes();
        }else if(name.equals("黄瓜")){
            madeFoodInter = new Cucumber();
        }else if(name.equals("芹菜")){
            madeFoodInter = new Celery();
        }
        return madeFoodInter;
    }
}

这里当然也可以对代码进行简化,但是这样更加直观。这样处理之后热菜师傅拿到的都是热菜的制作方法,冷菜师傅拿到的也只是冷菜的制作方法。调用此方法代码量不一定会减少,但逻辑会变清晰。

总之:接口隔离原则就是尽量让接口内的方法都是调用时必用的,原则上宁可接口多,也不要功能杂(当然也要根据开发实际情况)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值