6大设计模式(4):接口隔离原则

接口隔离原则:

接口分两种:

实例接口:Java中的类

类接口:interface定义的接口

原则的两种定义:

1.客户端不应该依赖它不需要的接口

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

需要对接口进行细化,保持纯洁性。

接口尽量细化,同时接口中的方法尽量少,增强专门性。

接口隔离原则是对接口进行规范约束,包含4层含义:

1.接口要尽量小

这是原则的核心定义。但是小也是有限度的,不能违反单一 职责原则。

2.接口要高内聚

什么是高内聚?就是提高类、接口的处理能力,减少对外的交互。类提供一个方法,你只需要知道调用这个方法就可以实现一系列的功能,但是具体是怎样实现的就不知道了。具体到接口隔离原则就是在接口中尽量少的公布public方法。

3.定制服务

单独为其中的某一模块抽象成一个接口。

4.接口的设计是有限的

需求总是在变化的。

用书中的例子“星探寻找美女”来进一步理解上述四个含义。

首先得有一个美女的接口和星探的抽象接口:

interface IPrettyGirl {
	// 长得好看
	public void goodLooking();

	// 身材好
	public void niceFigure();

	// 有气质
	public void greatTemperament();
}

abstract class AbstractSearcher {
	protected IPrettyGirl prettyGirl;

	public AbstractSearcher(IPrettyGirl prettyGirl) {
		this.prettyGirl = prettyGirl;
	}

	public abstract void show();
}

实现美女类和星探类:

class PrettyGirl implements IPrettyGirl {

	private String name;

	public PrettyGirl(String name) {
		this.name = name;
	}

	@Override
	public void goodLooking() {
		System.out.println(name + "--->脸蛋很漂亮");
	}

	@Override
	public void niceFigure() {
		System.out.println(name + "--->身材很好");
	}

	@Override
	public void greatTemperament() {
		System.out.println(name + "--->气质好");
	}

}

class Searcher extends AbstractSearcher {

	public Searcher(IPrettyGirl prettyGirl) {
		super(prettyGirl);
	}

	@Override
	public void show() {
		System.out.println("-----美女信息如下-----");
		// 展示面容
		super.prettyGirl.goodLooking();
		// 展示身材
		super.prettyGirl.niceFigure();
		// 展示气质
		super.prettyGirl.greatTemperament();
	}

}

场景类:

public class Client {

	public static void main(String[] args) {
		IPrettyGirl girl = new PrettyGirl("圆圆");
		AbstractSearcher searcher = new Searcher(girl);
		searcher.show();
	}
}

但是美女并不一定都是满足长得漂亮、身材好、有气质这三个条件,只满足其中一个也可以算是一个“美女”,只不过不是那么完美罢了。比如说,背影杀手。

那么具体到这个程序我们应该怎么去实现呢?PrettyGirl实现IPrettyGirl接口里的全部方法,所以只能对IPrettyGirl接口进行拆分、细化,拆分成两个或几个接口,这个视需求而定。

假设我们将美女分为气质型美女和外形美的美女,这样就是两个接口,外形美女也可以分成 (脸)长得漂亮的美女和身材好的美女。这样就是拆分成三个接口,分别是:IGoodLookingGirl、INiceFigureGirl、IGreatTemperamentGirl。

美女的接口及实现类:

interface IGoodLookingGirl {
	public void goodLooking();
}

interface INiceFigureGirl {
	public void niceFigure();
}

interface IGreatTemperamentGirl {
	public void greatTemperament();
}

// 长得好看的美女
class GoodLookingGirl implements IGoodLookingGirl {

	private String name;

	public GoodLookingGirl(String name) {
		this.name = name;
	}

	@Override
	public void goodLooking() {
		System.out.println(name + "--->脸蛋很漂亮");
	}
}

// 身材好的美女
class NiceFigureGirl implements INiceFigureGirl {

	private String name;

	public NiceFigureGirl(String name) {
		this.name = name;
	}

	@Override
	public void niceFigure() {
		System.out.println(name + "--->身材好");
	}

}

// 有气质的美女
class GreatTemperamentGirl implements IGreatTemperamentGirl {

	private String name;

	public GreatTemperamentGirl(String name) {
		this.name = name;
	}

	@Override
	public void greatTemperament() {
		System.out.println(name + "--->有气质");
	}

}

// 完美
class PrettyGirl implements IGoodLookingGirl, INiceFigureGirl,
		IGreatTemperamentGirl {

	private String name;

	public PrettyGirl(String name) {
		this.name = name;
	}

	@Override
	public void greatTemperament() {
		System.out.println(name + "--->有气质");
	}

	@Override
	public void niceFigure() {
		System.out.println(name + "--->身材好");
	}

	@Override
	public void goodLooking() {
		System.out.println(name + "--->脸蛋很漂亮");
	}

}

星探的接口及实现类:

abstract class AbstractSearcher {
	protected PrettyGirl prettyGirl;
	protected GoodLookingGirl goodLookingGirl;
	protected GreatTemperamentGirl greatTemperamentGirl;
	protected NiceFigureGirl niceFigureGirl;

	public AbstractSearcher(PrettyGirl prettyGirl) {
		this.prettyGirl = prettyGirl;
	}

	public AbstractSearcher(IGoodLookingGirl goodLookingGirl) {
		this.goodLookingGirl = (GoodLookingGirl) goodLookingGirl;
	}

	public AbstractSearcher(IGreatTemperamentGirl greatTemperamentGirl) {
		this.greatTemperamentGirl = (GreatTemperamentGirl) greatTemperamentGirl;
	}

	public AbstractSearcher(INiceFigureGirl niceFigureGirl) {
		this.niceFigureGirl = (NiceFigureGirl) niceFigureGirl;
	}

	public abstract void showPrettyGirl();

	public abstract void showGoodLookingGirl();

	public abstract void showNiceFigureGirl();

	public abstract void showGreatTemperamentGirl();
}

class Searcher extends AbstractSearcher {

	public Searcher(IGoodLookingGirl goodLookingGirl) {
		super(goodLookingGirl);
	}

	public Searcher(INiceFigureGirl niceFigureGirl) {
		super(niceFigureGirl);
	}

	public Searcher(IGreatTemperamentGirl temperamentGirl) {
		super(temperamentGirl);
	}

	public Searcher(PrettyGirl prettyGirl) {
		super(prettyGirl);
	}

	@Override
	public void showPrettyGirl() {
		super.prettyGirl.goodLooking();
		super.prettyGirl.niceFigure();
		super.prettyGirl.greatTemperament();
	}

	@Override
	public void showGoodLookingGirl() {
		super.goodLookingGirl.goodLooking();
	}

	@Override
	public void showNiceFigureGirl() {
		super.niceFigureGirl.niceFigure();
	}

	@Override
	public void showGreatTemperamentGirl() {
		super.greatTemperamentGirl.greatTemperament();
	}

}

场景类:

public class Client {

	public static void main(String[] args) {
		IGoodLookingGirl goodLookingGirl = new GoodLookingGirl("冰冰");
		INiceFigureGirl niceFigureGirl = new NiceFigureGirl("圆圆");
		IGreatTemperamentGirl greatTemperamentGirl = new GreatTemperamentGirl(
				"芳芳");
		PrettyGirl prettyGirl = new PrettyGirl("张三");
		AbstractSearcher goodlookingGirlsearcher = new Searcher(goodLookingGirl);
		AbstractSearcher niceFigureGirlSearcher = new Searcher(niceFigureGirl);
		AbstractSearcher greatTemperamentGirlSearcher = new Searcher(
				greatTemperamentGirl);
		AbstractSearcher prettyGirlSearcher = new Searcher(prettyGirl);

		goodlookingGirlsearcher.showGoodLookingGirl();
		niceFigureGirlSearcher.showNiceFigureGirl();
		greatTemperamentGirlSearcher.showGreatTemperamentGirl();
		prettyGirlSearcher.showPrettyGirl();

	}
}

运行结果:

冰冰--->脸蛋很漂亮

圆圆--->身材好

芳芳--->有气质

张三--->脸蛋很漂亮

张三--->身材好

张三--->有气质

写完之后本人就懵了,其实写的过程中就已经懵了,越写越觉得理解的有问题,怎么会这么麻烦。。。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-07 20:11:57

6大设计模式(4):接口隔离原则的相关文章

Java 设计模式(十三) 接口隔离原则(ISP)

接口隔离原则(Interface Segregation Principle) ISP基本概念 接口 实例接口(Object Interface):一个类的实例对象是对一个类型的事物的描述,这时一种接口. 类接口(Class Interface):Java中interface关键定义的接口,也是我们通常理解的狭义的接口 ISP定义 客户端(模块)不应该依赖它不需要的接口(接口的纯粹性) 一个模块应该依赖它需要的接口,需要什么接口就提供什么接口,把不需要的接口剔除掉,那就需要对接口进行细化,保证接

设计模式之接口隔离原则(ISP)

一.定义: ISP:Interface Segregation Principle 接口隔离原则表明客户端不应该被强迫实现一些他们不会使用的接口,应该把胖接口中的方法分组,然后用多个接口代替它,每个接口服务于一个子模块 使用多个专门的接口比使用单一的总接口要好.一个类对另外一个类的依赖性应当是建立在最小的接口上的.一个接口代表一个角色,不应当将不同的角色都交给一个接口.没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染. "不应该强迫客户依赖于它们不用的方法.接口属于客户,不

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

接口隔离原则 定义:客户端不应该依赖它不需要的接口:一个类对另一个类的依赖应该建立在最小的接口上. 问题由来:类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要的方法. 解决方案:将臃肿的接口I拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系.也就是采用接口隔离原则. 接口隔离原则(Interface  Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端

设计模式六大原则(4):接口隔离原则(Interface Segregation Principle)

接口隔离原则: 使用多个专门的接口比使用单一的总接口要好. 一个类对另外一个类的依赖性应当是建立在最小的接口上的. 一个接口代表一个角色,不应当将不同的角色都交给一个接口.没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染. "不应该强迫客户依赖于它们不用的方法.接口属于客户,不属于它所在的类层次结构."这个说得很明白了,再通俗点说,不要强迫客户使用它们不用的方法,如果强迫用户使用它们不使用的方法,那么这些客户就会面临由于这些不使用的方法的改变所带来的改变. 定义:

设计模式六大原则: 辅导班的因材施教 -- 接口隔离原则

我的女朋友小肉是一名光荣的辅导班老师,说来惭愧,我上初中那会儿最讨厌辅导班老师了,每天上学都这么累了,晚上还得去见辅导班老师,神烦,奈何目前的教育机制下,很多家长认为辅导班是提高成绩比较靠谱的方式,导致这个行业市场很大. 小肉教三个水平不同的小班,那天看她在准备讲义和试题,同一章内容需要做三份,其中很多内容都是重复的,自诩设计模式略懂一二的我跟她说: 你这个讲义跟我敲代码很像,相似的内容这么多,直接复制粘贴容易出问题啊,还不如把公共的部分提一个接口,然后让三种水平的讲义都实现这个接口 比如这样:

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

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

小菜学设计模式——接口隔离原则

背景 本文标题为什么叫小菜学习设计模式,原因是本文内容主要是学习<大话设计模式>时的笔记摘要部分,当然,并不是记录书中小菜的学习过程,这个完全没有意义,而是指本人学习设计模式的成长之旅. 真诚的希望自己能够从一名小菜成长为一名大鸟! 编写的程序应该满足: 1)可维护 2)可扩展 3)可复用 4)够灵活 废话少说,言归正传,设计模式原则之:接口隔离原则 书面理解 接口隔离原则:使用多个小的专门的接口,而不要使用一个大的总接口. 接口应该是内聚的,应该避免"胖"接口.一个类对另

设计模式六大原则(4):接口隔离原则(转载)

设计模式六大原则(4):接口隔离原则 定义:客户端不应该依赖它不需要的接口:一个类对另一个类的依赖应该建立在最小的接口上. 问题由来:类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要的方法. 解决方案:将臃肿的接口I拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系.也就是采用接口隔离原则. 举例来说明接口隔离原则: (图1  未遵循接口隔离原则的设计) 这个图的意思是:类A依赖接口I中的方法1.方法2.方法

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

个人blog 此篇博文地址:http://www.sanyinchenblog.com/?p=174 接口隔离原则: demo: https://github.com/sanyinchen/UMLDemo 接口的两种类型: (1)实例接口 (2)类接口,使用Interface定义的接口 隔离: (1)客户端不应该依赖它不需要的接口 (2)类间的依赖关系应该建立在最小的接口上 场景描述:你一日在大街上闲着无聊,在大街上喊了一句美女,结果好多女生都回过头注视你. 我们现在给美女下一个定义: (1)好