一、设计模式接口隔离原则定义
客户端不应该被迫依赖于它不使用的方法,一个类对另一个类的依赖应该建立在最小的接口上。要为各个类建立它们需要的专用接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。
接口隔离原则和单一职责都是为了提高类的内聚性、降低它们之间的耦合性,体现了封装的思想,但两者是不同的:
- 单一职责原则注重的是职责,而接口隔离原则注重的是对接口依赖的隔离。
- 单一职责原则主要是约束类,它针对的是程序中的实现和细节;接口隔离原则主要约束接口,主要针对抽象和程序整体框架的构建。
二 、原则作用
- 将臃肿庞大的接口分解为多个粒度小的接口,可以预防外来变更的扩散,提高系统的灵活性和可维护性。
- 接口隔离提高了系统的内聚性,减少了对外交互,降低了系统的耦合性。
- 如果接口的粒度大小定义合理,能够保证系统的稳定性;但是,如果定义过小,则会造成接口数量过多,使设计复杂化;如果定义太大,灵活性降低,无法提供定制服务,给整体项目带来无法预料的风险。
- 使用多个专门的接口还能够体现对象的层次,因为可以通过接口的继承,实现对总接口的定义。
- 能减少项目工程中的代码冗余。过大的大接口里面通常放置许多不用的方法,当实现这个接口的时候,被迫设计冗余的代码。
三、原则实现实例
在具体应用接口隔离原则时,应该根据以下几个规则来衡量。
- 接口尽量小,但是要有限度。一个接口只服务于一个子模块或业务逻辑。
- 为依赖接口的类定制服务。只提供调用者需要的方法,屏蔽不需要的方法。
- 了解环境,拒绝盲从。每个项目或产品都有选定的环境因素,环境不同,接口拆分的标准就不同深入了解业务逻辑。
- 提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。
1、新建main.java空白文件,cursor输入指令
2、自动生成代码以及文件
2.1、Main.java代码如下:
javascript
public class Main {
public static void main(String[] args) {
System.out.println("Testing Basic Music Player:");
MusicPlayer basicPlayer = new BasicMusicPlayer();
testMusicPlayer(basicPlayer);
System.out.println("\nTesting Smart Music Player:");
SmartMusicPlayer smartPlayer = new SmartMusicPlayer();
testAdvancedMusicPlayer(smartPlayer);
testVolumeControl(smartPlayer);
}
private static void testMusicPlayer(MusicPlayer player) {
player.play();
player.stop();
}
private static void testAdvancedMusicPlayer(AdvancedMusicPlayer player) {
player.play();
player.pause();
player.next();
player.previous();
player.stop();
}
private static void testVolumeControl(VolumeControl player) {
player.setVolume(50);
}
}
2.2、BasicMusicPlayer .java代码如下:
BasicMusicPlayer 只实现了 MusicPlayer 接口,因为它只支持基本的播放和停止功能。
javascript
public class BasicMusicPlayer implements MusicPlayer {
@Override
public void play() {
System.out.println("Basic Music Player: Playing music");
}
@Override
public void stop() {
System.out.println("Basic Music Player: Stopping music");
}
}
2.3、SmartMusicPlayer.java代码如下:
SmartMusicPlayer 实现了 AdvancedMusicPlayer 和 VolumeControl 接口,因为它支持更多的功能。
javascript
public class SmartMusicPlayer implements AdvancedMusicPlayer, VolumeControl {
@Override
public void play() {
System.out.println("Smart Music Player: Playing music");
}
@Override
public void stop() {
System.out.println("Smart Music Player: Stopping music");
}
@Override
public void pause() {
System.out.println("Smart Music Player: Pausing music");
}
@Override
public void next() {
System.out.println("Smart Music Player: Playing next track");
}
@Override
public void previous() {
System.out.println("Smart Music Player: Playing previous track");
}
@Override
public void setVolume(int volume) {
System.out.println("Smart Music Player: Setting volume to " + volume);
}
}
2.4、AdvancedMusicPlayer .java代码如下:
javascript
public interface AdvancedMusicPlayer extends MusicPlayer {
void pause();
void next();
void previous();
}
2.5、VolumeControl.java代码如下:
javascript
public interface VolumeControl {
void setVolume(int volume);
}
3、运行主程序输出
客户端代码(Main 类)可以根据需要使用不同的接口,而不需要依赖于它们不使用的方法。
这种设计允许我们根据设备的实际功能来实现相应的接口,而不是强制所有设备实现所有功能。这就是接口隔离原则的核心思想:客户端不应该被迫依赖于它们不使用的方法。
您可以直接运行这个 Main 类来查看输出结果,这将给您一个直观的了解接口隔离原则如何在实际开发中应用。