设计模式六大原则之接口隔离原则

一、概念:

  接口隔离原则有两种定义:

1、Clients should not be forced to depend upon interfaces that they don‘t use.

客户端不应该强行依赖它不需要的接口

2、The dependency of one class to another one should depend on the smallest possible
interface.

类间的依赖关系应该建立在最小的接口上

客户端不应该依赖它不需要的接口。接口中的方法应该尽量少,不要使接口过于臃肿,不要有很多不相关的逻辑方法。而且要以满足单一职责原则为前提。

二、例子:

用搬砖砌墙为例。砖头有红砖,水泥砖等等。这里假设:懒惰的员工和勤快的员工所拥有的技能不同。勤快的员工会搬砖也会砌墙。懒的员工只会砌墙。

所以砌墙的操作与搬砖的操作得隔离。类图如下:

看了类图只会,看看代码如下:

工人接口:【无论是砌墙的工人还是搬砖的工人,都要知道用什么砖,添加了一个setBrick方法(依赖倒置原则)】

package dim.interfaceiso.simples.brick;

public interface IBrickMan {
	/**
	 * 设置名字
	 * @param Name
	 */
        public void setName(String Name);
        /**
         * 设置年龄
         * @param age
         */
        public void setAge(int age);
        /**
         * 设置搬什么砖
         * @param brick
         */
        public void setBrick(IBrick brick);
}

砌墙工人接口【继承工人接口】:

package dim.interfaceiso.simples.brick;

public interface IBrickBuilder extends IBrickMan{
    /**
     * 砌墙
     */
	public void bulidWall();
}

搬砖工人接口:

package dim.interfaceiso.simples.brick;

public interface IBrickLoader {

	/**
	 * 搬砖
	 */
	public void removedBrick();
}

砖头接口:

package dim.interfaceiso.simples.brick;

import java.awt.Color;

public interface IBrick {
	/**
	 * 设置砖头尺寸
	 * @param size
	 */
	public void setSize(int size);
	/**
	 * 设置砖头颜色
	 * @param color
	 */
	public void setColor(Color color);
   /**
    * 设置砖名
    */
	public void setName(String Name);
	public String  getName();
}

红砖类:

package dim.interfaceiso.simples.brick;

import java.awt.Color;

public class RedBrick implements IBrick{

	//红砖尺寸
	private int size;
	//红砖颜色
	private Color color;
   private String Name="";
	public RedBrick() {
		// TODO Auto-generated constructor stub
	//System.out.println("red brick!");
	}
	@Override
	public void setSize(int size) {
		// TODO Auto-generated method stub
		this.size=size;
		System.out.println("red brick size is  "+this.size);
	}

	@Override
	public void setColor(Color color) {
		// TODO Auto-generated method stub
		this.color=color;
	}
	@Override
	public void setName(String Name) {
		// TODO Auto-generated method stub
		this.Name=Name;
	}
	@Override
	public String getName() {
		// TODO Auto-generated method stub
		return Name;
	}

}

水泥砖类:

package dim.interfaceiso.simples.brick;

import java.awt.Color;

public class CementBrick implements IBrick{

	//尺寸
	private int size;
	//颜色
	private Color color;
   private String Name="";

	public CementBrick() {
		// TODO Auto-generated constructor stub
	//System.out.println("Cement brick!");
	}
	@Override
	public void setSize(int size) {
		// TODO Auto-generated method stub
		this.size=size;
		System.out.println("Cement brick size is  "+this.size);
	}

	@Override
	public void setColor(Color color) {
		// TODO Auto-generated method stub
		this.color=color;
	}
	@Override
	public void setName(String Name) {
		// TODO Auto-generated method stub
		this.Name=Name;
	}
	@Override
	public String getName() {
		// TODO Auto-generated method stub
		return Name;
	}

}

勤快员工类:【会砌墙也会搬砖,实现搬砖和砌墙接口】

package dim.interfaceiso.simples.brick;

public class DiligentWorker implements IBrickBuilder,IBrickLoader{

	private String NameOfMan="";
	private IBrick brick;
	@Override
	public void setName(String Name) {
		// TODO Auto-generated method stub
		NameOfMan=Name;
	}

	@Override
	public void setAge(int age) {
		// TODO Auto-generated method stub

	}
	@Override
	public void setBrick(IBrick brick) {
		// TODO Auto-generated method stub
		this.brick=brick;
	}
	@Override
	public void removedBrick() {
		// TODO Auto-generated method stub
		System.out.println(NameOfMan+"搬 "+brick.getName());

	}

	@Override
	public void bulidWall() {
		// TODO Auto-generated method stub
		System.out.println(NameOfMan+"用"+brick.getName()+"砌墙了");
	}

}

懒惰员工类:【只会砌墙,实现砌墙接口】

package dim.interfaceiso.simples.brick;

public class LazyWorker implements IBrickBuilder{

	private String Name="";
	private IBrick brick;
	@Override
	public void setName(String Name) {
		// TODO Auto-generated method stub
		this.Name=Name;
	}

	@Override
	public void setAge(int age) {
		// TODO Auto-generated method stub

	}

	@Override
	public void setBrick(IBrick brick) {
		// TODO Auto-generated method stub
	this.brick=brick;
	}

	@Override
	public void bulidWall() {
		// TODO Auto-generated method stub
		System.out.println(Name+"用"+brick.getName()+"砌墙了");
	}

}

测试类:员工小明是勤快的员工,会砌墙也会搬砖。小华比较懒,只会砌墙。

package dim.interfaceiso.simples.brick;

public class TestClass {

	public static void main(String[] args) {
		//红砖
	    IBrick redBrick=new RedBrick();
	    //水泥砖
	    IBrick cementBrick=new CementBrick();
	    //设置砖头名
	    redBrick.setName("红砖");
	    cementBrick.setName("水泥砖");
	    //员工
	DiligentWorker xiaoMing=new DiligentWorker();
	LazyWorker xiaoHua=new LazyWorker();

	xiaoMing.setName("小明");
	xiaoMing.setBrick(redBrick);
	xiaoMing.removedBrick();
	xiaoMing.bulidWall();

	System.out.println("============");
	xiaoMing.setBrick(cementBrick);
	xiaoMing.removedBrick();

	System.out.println("============");
	xiaoHua.setName("小华");
	xiaoHua.setBrick(cementBrick);
	xiaoHua.bulidWall();

	}
}

测试结果:

小明搬 红砖

小明用红砖砌墙了

============

小明搬 水泥砖

============

小华用水泥砖砌墙了

三、说明:

1、接口隔离与单一职责的区别:单一职责原则是要求类和接口的职责单一,职责是业务逻辑上的划分。

2、根据接口隔离原则拆分时,先满足单一职责原则。

3、接口要高内聚,不要太臃肿。

相关链接:

设计模式六大原则之单一职责原则

设计模式六大原则之里氏替换原则

设计模式六大原则之依赖倒置原则

有所不足、多多指正、谢谢!

参考资料:

《设计模式之禅》

《HeadFirst》

设计模式六大原则

时间: 2024-08-08 19:44:24

设计模式六大原则之接口隔离原则的相关文章

设计模式原则之接口隔离原则

在讲接口隔离原则之前,我们先明确一下我们的主角,什么是接口,接口分为两种: 一种是实例接口 (Object Interface),在 Java 中声明一个类,然后用 new 关键字产生的一个实例,它是对一个类型的事 物描述,这是一种接口,比如你定义个 Person 这个类,然后使用 Person zhangSan = new Person()产生了 一个实例,这个实例要遵从的标准就是 Person 这个类,Person 类就是 zhangSan 的接口,看不懂?不要紧, 那是让 Java 语言浸

面向对象的六大原则之 接口隔离原则——ISP

ISP = Interface Segregation Principle ISP的定义如下: 1.客户端不应该依赖他不需要的接口 2.一个类对另外一个类的依赖性应该是建立在最小的接口上 3.不应当将不同的接口合并在一起,形成一个臃肿的大接口,这是对接口的污染 4.使用多个专门的接口要比使用单一的总接口要好 ISP的几个使用原则 1.根据接口隔离原则拆分接口时,首先必须满足单一职责原则: 没有哪个设计可以十全十美的考虑到所有的设计原则,有些设计原则之间就可能出现冲突,就如同单一职责原则和接口隔离

深入理解JavaScript系列(21):SOLID五大原则之接口隔离原则ISP(转载)

深入理解JavaScript系列(21):SOLID五大原则之接口隔离原则ISP 前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第4篇,接口隔离原则ISP(The Interface Segregation Principle). 英文原文:http://freshbrewedcode.com/derekgreer/2012/01/08/solid-javascript-the-interface-segregation-principle/注:这篇文章作者写得

面向对象原则之一 接口隔离原则

原文:面向对象原则之一 接口隔离原则 前言 面向对象有人分为五大原则,分别为单一职责原则.开放封闭原则.依赖倒置原则.接口隔离原则.里氏替换原则. 也有人分为六大原则,分别为单一职责原则.开放封闭原则.依赖倒置原则.接口隔离原则.里氏替换原则.迪米特法则. 现在我们来介绍接口隔离原则 接口隔离原则 1)概念 客户端不应该依赖它不需要的接口.一个类对另一个类的依赖应该建立在最小的接口上. 怎么理解呢?通俗一点就是说接口尽量细分,把不需要的方法尽量写在2个不同的接口上. 假如我有一个接口Interf

设计原则之接口隔离原则

segregate   v.隔离 se 蛇  gre green格林  gate门 蛇被格林用门隔离了. 设计原则之接口隔离原则 动机:         客户不应该被强制实现他们不用的方法.应该用多个小的接口代替庞大功能全的接口. 结论:        该原则在代码设计的时候就要考虑.可以使用适配器模式将胖接口隔离. Bad Example:    缺点:         1.如果新增一个robot机器人工人,那么eat方法就是多余的了. // interface segregation pri

设计模式之禅--六大设计原则之接口隔离原则

设计模式就是让我们更方便的解决问题. 这里分享一个故事.我有一个朋友,嗯没错就是一个朋友,参加一个软件比赛,一个同学写服务器上的代码,三天两头更新,丝毫不考虑写客户端的人的感受,简直不能再牛.如果Java的更新有这么一次,没有考虑在不影响以前代码的基础上做修改,得有多少程序员吐血身亡. 接口隔离原则的定义: 建立单一接口,不要建立臃肿放大的接口.接口尽量细化,同时接口中的方法尽量少. 这不是单一职责原则,单一职责要求的是类和接口的职责单一,注重的是职责,这是业务逻辑上的划分,而借口隔离原则要求接

深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP

前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第4篇,接口隔离原则ISP(The Interface Segregation Principle). 英文原文:http://freshbrewedcode.com/derekgreer/2012/01/08/solid-javascript-the-interface-segregation-principle/ 注:这篇文章作者写得比较绕口,所以大叔理解得也比较郁闷,凑合着看吧,别深陷进去了 接口隔离原则的描述

迪米特原则与接口隔离原则

强调组件的封装性和信息隐藏的功能. 封装的越好,模块间的耦合越小: 隐藏的越好,组件的可用性越好. 在类的结构设计上,每一个类都应当尽量降低成员的访问权限 http://blog.csdn.net/wangjunkg/article/details/3762132 四.接口隔离原则 全称:“Interface Segregation Principle” 说明:使用多个专一功能的接口比使用一个的总接口总要好.从一个客户类的角度来讲:一个类对另外一个类的依赖性应当是建立在最小接口上的.过于臃肿的接

面向对象设计原则之接口隔离原则

接口隔离原则定义如下: 接口隔离原则(Interface  Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口. 根据接口隔离原则,当一个接口太大时,我们需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可.每一个接口应该承担一种相对独立的角色,不干不该干的事,该干的事都要干.这里的“接口”往往有两种不同的含义:一种是指一个类型所具有的方法特征的集合,仅仅是一种逻辑上的抽象:另外一种是指某