Сложно ответить на этот вопрос, поскольку ваш интерфейс для Door
кажется неполным в том смысле, что неясно, что должны делать open()
и close()
.Давайте разберемся с этим, добавив метод isOpen()
и определив, что после вызова open()
последующий вызов isOpen()
должен вернуть true
(и я намеренно игнорирую вопрос о том, что произойдет, если вы попытаетесьдля краткости откройте и уже откройте дверь).
В этом случае вы определенно нарушаете принцип LSP - если вы попытаетесь открыть запертую дверь, вы потерпите неудачу, и дверь останетсязакрыто.
Один из способов решения этой проблемы - добавить возвращаемое значение в методы open()
и close()
, чтобы они могли сообщать, была ли операция выполнена успешно:
public interface Door {
/**
* Checks if the door is open.
* @return {@code true} if the door is open, {@code false} if not.
boolean isOpen();
/**
* Attempt to open the door.
* @return {@code true} if the door was successfully opened,
* {@code false} if not.
* In other words, if a call to {@code open} returns {@code true}, a
* subsequent call to {@link #isOpen} will return {@code true}.
*/
boolean open();
/**
* Attempt to close the door.
* @return {@code true} if the door was successfully closed,
* {@code false} if not.
* In other words, if a call to {@code close} returns {@code true}, a
* subsequent call to {@link #isOpen} will return {@code false}.
*/
void close();
}
public class RegularDoor implements Door {
private boolean isOpen;
@Override
public boolean isOpen() {
return isOpen;
}
@Override
public boolean open() {
return isOpen = true;
}
@Override
public boolean close() {
return isOpen = false;
}
}
public class LockedDoor implements Door {
private Lock lock;
private boolean isOpen;
@Override
public boolean isOpen() {
return isOpen;
}
@Override
public boolean open() {
if (!lock.isLocked()) {
return isOpen = true;
}
return false;
}
@Override
public boolean close() {
return isOpen = false;
}
// Not shown here - methods to lock and unlock the door
}