关于解耦的思考

前言
以前记得在知乎上看过,一个神奇的例子,大致上来说就是一个手机接触到了金属汤匙,结果手机显示检测的未知设备。其实从一方面看来这也算是一个代码复用的思想吧。

在设计程序的时候,我们都会尽力提高代码的复用性,这也导致在方法中会产生依赖的关系,但是对于使用者而言,依赖关系会添加诸多的限制,因此在设计程序的时候会倾向于高内聚,低耦合,内聚是模块内部自身各个元素的紧密联系,而低耦合则倾向于减少模块于模块之间的依赖关系从而让使用者的限制减少。
关于解耦的方式现在一般倾向于利用面向接口的形式实现,而不是利用类,因为一是如果使用类的结果便是传入的参数必须是该类的本身或子类的对象,这便产生了一定的约束也就是耦合,二是这样可能会暴露一些实例域中的数据,而如果使用接口的话,可以在很大程度上减少这种耦合关系。
这里假设以类继承实现代码的复用:

public class Slot {
    public void  doSomething() {
            System.out.println("Interface");
    }
}
public class TypeC extends  Slot{
    @Override
    public void doSomething() {
        System.out.println("TypeC");
    }
}
public class USB  extends  Slot {
    @Override
    public void doSomething() {
        System.out.println("TypeC");
    }
}
public class Apply {

    public static void insert(Slot inter) {
        System.out.println(inter.getClass().getName());
        inter.doSomething();
    }
    public static void main(String[] args) {
        insert(new TypeC());
        insert(new USB());
    }
}

我们在为了使apply的insert方法提高复用性,会根据传入对象的不同执行不同的功能,这也是一种策略模式,但是同样的产生了一定的约束:要求传入的对象必须是Slot或其子类对象,这就产生了比较明显的耦合过程,如果我们有一个类有doSomething()的方法但是已经继承了其他的父类对象,这就比较麻烦了。

public class Basic {
    private String name;
    public Basic(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}
public class Others extends Basic {
    public Others(String name) {
        super(name);

    }

    public void  doSomething() {
        System.out.println("others");
    }
}

这个时候本来的思想是apply.的insert方法应该有很高的复用性但是对于Others类就明显的无法执行,这也就是耦合比较高的体现,当然也可以解决这种情况,那便是为Others设计一个adapter从而适配这个apply的insert

public class OtherAdapter extends Slot {
        Others others;
        public  OtherAdapter(Others others) {
            super();
            this.others = others;
        }
        @Override
        public void doSomething() {
            others.doSomething();
        }
}

不过也是由于耦合较高因此不得不使用一个适配器来实现,但是如果使用接口的话可以大大降低这种耦合程度

public interface Slot {
    public void  doSomething();
}

那么只要实现这个接口便可以

public class Others extends Basic implements Slot {
    public Others(String name) {
        super(name);

    }

    public void  doSomething() {
        System.out.println("others");
    }
}

这样apply的insert便也可以接受。并且除了这个好处以外,如果我们不能对others进行修改的化,我们可以利用适配器实现

public class OtherAdapter implements Slot {
        Others others;
        public  OtherAdapter(Others others) {
            super();
            this.others = others;
        }
        @Override
        public void doSomething() {
            others.doSomething();
        }
}

(当然这里的适配器用的是代理,如果想依然可以利用OtherAdapter继承Others来实现适配)这样我们可以对这个OtherAdapter进行更高程度的扩展了,而如果用以前的类继承的化就会有一定程度上的限制了。所以接口可以才很大程度上减轻耦合。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值