以一个Door的为例,该Door具有执行两个动作 Open 和Close
此时可以用接口和抽象类两种方法来定义
---------
abstract class Door{
abstract void open();
abstract void close();
}
---------
interface Door{
void open();
void close();
}
其他的具体的Door可以用上述接口和抽象类中的任何一个,现在若要求Door还具有报警的功能呢 如何处理
解决方案一:
---------
abstract class Door{
abstract void open();
abstract void close();
abstract void alarm();
}
或
interface Door{
void open();
void close();
void alarm();
}
那么具有报警功能的Door如下:
class AlarmDoor extends Door{
void open();
void close();
void alarm();
}
或
class AlarmDoor implements Door{
void open();
void close();
void alarm();
}
这种方法违反了ISP原则:在Door的定义中,把Door概念本身固有的行为方法和 另外一个概念“报警器”的行为方法混在了一起,若是这样,那些仅仅依赖于Door这个概念的模块,会因为“报警器”这个概念的改变而改变。
解决方案二:
既然open,close和alram是两个不同的概念,根据ISP原则应该分别定义在两个概念的抽象类中,定义方式有 定义2个抽象类,定义一个抽象类一个接口。
但是Java不支持多继承 所以最后方案如下:
---------------------------------------------
class AlarmDoor extends Door{
void open();
void close();
}
interface Alarm {
void alarm()
}
class AlarmDoor extends Door implements Alarm{
void open(){.....}
void close(){.....}
void alarm(){.....}
}
总结:这个例子非常贴切。自己体会吧