接口隔离原则(Interface Segregation Principle, ISP)

在软件设计、编码过程中有几个基本原则即SOLID原则,学习理解能够帮忙我们写出更健壮的代码。SOLID是五个基本原则的首字母。这五个原则如下:

此篇来学习一下接口隔离原则(Interface Segregation Principle)

接口隔离原则:

Clients should not be forced to depend upon interfaces that they don’t use.

即:

客户不应该被迫依赖于他们不使用的接口。

接口隔离原则规定客户端不应该被迫实现他们不使用的接口。 代替一个大的(胖的)接口,许多小的(瘦的)接口要更好,讲一个个子模块拆分开。看起来是不是感觉和单一职责原则有些类似,都有强调到按照清晰的职责来拆分。

当然,单一职责更注重类的职责,引起类的变化的原因要有且仅有一个。而接口隔离原则强调要提供足够小的接口。

我们参考下面的例子看一下:

// interface segregation principle - bad example
interface IWorker {
	public void work();
	public void eat();
}

class Worker implements IWorker{
	public void work() {
		// ....working
	}
	public void eat() {
		// ...... eating in launch break
	}
}

class SuperWorker implements IWorker{
	public void work() {
		//.... working much more
	}

	public void eat() {
		//.... eating in launch break
	}
}

class Manager {
	IWorker worker;

	public void setWorker(IWorker w) {
		worker=w;
	}

	public void manage() {
		worker.work();
	}
}

对于IWorker来说有work和eat,因此Worker也实现了work和eat两个方法,但是对于Manager来说,他值关心work,而不关心eat。所以,对于Manager来说IWorker接口暴露了它不感兴趣,也不需要的方法。

不满足接口隔离原则,因而应该进行拆分:

// interface segregation principle - good example
interface IWorker extends Feedable, Workable {
}

interface IWorkable {
	public void work();
}

interface IFeedable{
	public void eat();
}

class Worker implements IWorkable, IFeedable{
	public void work() {
		// ....working
	}

	public void eat() {
		//.... eating in launch break
	}
}

class Robot implements IWorkable{
	public void work() {
		// ....working
	}
}

class SuperWorker implements IWorkable, IFeedable{
	public void work() {
		//.... working much more
	}

	public void eat() {
		//.... eating in launch break
	}
}

class Manager {
	Workable worker;

	public void setWorker(Workable w) {
		worker=w;
	}

	public void manage() {
		worker.work();
	}
}

这样,拆分后我们可以看到,系统解耦,从而更容易重构、扩展、修改、和重新部署。

最后我们来总结一下:

1、接口应该尽量小,但是要有限度。

2、接口只暴露给依赖接口的类(调用端)需要的方法,而不需要暴露不需要的方法。

3、提高模块的内聚,减少它们之间的耦合。

当然,如果系统已经成型很久,不容易改变,可以运用适配者模式(Adapter pattern)来实现接口隔离原则。

像其他的原则一样,接口隔离原则也是需要在设计、重构过程中需要话费时间来思考如何运用。有时候因为时间紧迫我们可能着急于完成功能,但是当我们不断的进行扩展,添加新功能的时候,会发现,如果不重构,这段代码将越来越难重构,以至于拖累项目运转。当然,我们也不可过度设计。

参考:

http://blog.csdn.net/moxiaoya1314/article/details/51899048

[https://en.wikipedia.org/wiki/Interface_segregation_principle](

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值