接口隔离原则

转载请注明出处!!!http://blog.csdn.net/zhonghuan1992

         所有配套代码均在github上:https://github.com/ZHONGHuanGit/DesignPattern



跟着ZHONGHuan学习设计模

接口隔离原则







对接口的理解

         这里的接口,不是java语言内部的interface的意思,在这里,可以将接口理解为一个类提供的所有的方法的特征集合,通俗点说就是所有可见方法和可见变量(java的说法, c++的说法是可见函数和可见属性元素)。

接口隔离原则的定义:

一个类对于另一个类的依赖应当建立在最小的接口上,不应当依赖一些不需要的接口。

 

         从实例中来体会定义。假设我们有两个学生类,文科生和理科生,他们需要考试,我们把考试抽象出一个接口,让不同的实现类来实现。如下图一所示:

        接口隔离原则_第1张图片

图一

     从上面的设计中,我们用代码实现

/**
 * 考试抽象类
 * 
 * @author zhonghuan
 */
interface Exam
{
	public void chinese();// 考语文

	public void math();// 考数学

	public void physics();// 考物理

	public void geolography();// 考地理
}

/**
 * 文科生实现考试抽象类,文科生不考物理
 * 
 * @author zhonghuan
 */
class ExamForLiberalArtStu implements Exam
{
	public void chinese()
	{
		System.out.println("考语文");
	}

	public void math()
	{
		System.out.println("考数学");
	}

	public void physics()
	{
		// "不考物理", 不用实现, 没有意义
	}

	public void geolography()
	{
		System.out.println("考地理");
	}
}

/**
 * 理科生实现考试抽象类,理科生不考地理
 * 
 * @author zhonghuan
 */
class ExamForScienceStu implements Exam
{
	public void chinese()
	{
		System.out.println("考语文");
	}

	public void math()
	{
		System.out.println("考数学");
	}

	public void physics()
	{
		System.out.println("考物理");
	}

	public void geolography()
	{
		// 理科生不考地理,不用实现没有意义
	}
}

         可以看到,设计上,用一个接口来作为父类,可是子类却要实现自己不会没有必要实现的方法,这样的设计显然是不合适的。如果接口过于臃肿,如上面的例子,虽然看上去,你只是多实现了一个方法,但是如果是其它的情况,方法比较多的情况下,是不合适的,那样的接口的过于臃肿会更加明显。

         所以,在设计的时候,应当对接口在整个生命周期中扮演的角色搞清楚,针对上面的实例,考试接口分为两个角色,一个是文科生考试的角色,一个是理科生考试的角色,所以可以将这个接口分为三个接口。

        接口隔离原则_第2张图片

图二

         从图二的设计中,将原来的一个接口分为三个接口,一般考试接口,理科考试接口,文科考试接口,文科生和理科生都可以依赖最小的接口,而不用担心接口臃肿的问题。

     

/**
 * 考试抽象类
 * 
 * @author zhonghuan
 */
interface Exam
{
	public void chinese();// 考语文

	public void math();// 考数学
}

/**
 * 理科生考试接口
 */
interface ScienceExam
{
	public void physics();// 考物理
}

/**
 * 文科生考试接口
 */
interface LiberalArtExam
{
	public void geolography();// 考地理
}

/**
 * 文科生考试实现类
 * 
 * @author zhonghuan
 */
class ExamForLiberalArtStu implements Exam, LiberalArtExam
{
	public void chinese()
	{
		System.out.println("考语文");
	}

	public void math()
	{
		System.out.println("考数学");
	}

	public void geolography()
	{
		System.out.println("考地理");
	}
}

/**
 * 理科生考试实现类
 * 
 * @author zhonghuan
 */
class ExamForScienceStu implements Exam, ScienceExam
{
	public void chinese()
	{
		System.out.println("考语文");
	}

	public void math()
	{
		System.out.println("考数学");
	}

	public void physics()
	{
		System.out.println("考物理");
	}
}

 

        接口隔离原则的含义是:建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。也就是说,我们要为各个类建立专用的接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。在上面的例子中,原本依赖于一个大的抽象接口,改为依赖于3个更细化的抽象接口,可以避免接口的污染.

使用接口隔离原则的注意事项

         1接口尽量小,尽量遵循接口隔离原则,不要意图构建一个万能接口。

         2设计接口时,应根据实际情况分析,尽可能设计小的接口,为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。

         3提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。

在以后的应用中慢慢去掌握这个原则,在后面的设计模式中,我们还会重温这个原则。

你可能感兴趣的:(接口隔离原则)