インターフェイス分離の原則(ISP)のサンプルコード

こんなん?

● ビフォー:
abstract class Timer {
    public abstract void register(int timeout, TimerClient client);
}

interface TimerClient {
    public void timeout();
}

abstract class Door implements TimerClient {
    public abstract void lock();
    public abstract void unlock();
    public abstract boolean isDoorOpen();
}

class TimedDoor extends Door {
    @Override public void lock() {}
    @Override public void unlock() {}
    @Override public boolean isDoorOpen() { return false; }
    
    public void timeout() { System.out.println("開けたら閉める!"); } // <!> TimerClient を実装したことにより追加されたメソッド
}

class TimerImpl extends Timer {
    @Override public void register(int timeout, TimerClient client) {
        Thread th = new TimeoutChecker(timeout, client);
        th.start();
    }
    
    class TimeoutChecker extends Thread {
        long timeout, startTime;
        TimerClient client;
        TimeoutChecker(int timeout, TimerClient client) {
            this.startTime = System.currentTimeMillis();
            this.timeout = timeout;
            this.client = client;
        }
        
        public void run() {
            while(true) {
                if (System.currentTimeMillis() - startTime > timeout) {
                    client.timeout();
                    return;
                }
            }
        }
    }
}

public class InterfaceSegregationPrincipleTest {

    public static void main(String[] args) {
        Door door = new TimedDoor();
        Timer timer = new TimerImpl();
        
        timer.register(3000, door);
        //door.unlock();
        //door.lock();
    }

}
● アフター:
abstract class Timer {
    public abstract void register(int timeout, TimerClient client);
}

interface TimerClient {
    public void timeout();
}

abstract class Door { // <!> TimerClient への依存がなくなった
    public abstract void lock();
    public abstract void unlock();
    public abstract boolean isDoorOpen();
}

class TimedDoor extends Door {
    @Override public void lock() {}
    @Override public void unlock() {}
    @Override public boolean isDoorOpen() { return false; }
    
    public void timeout () { System.out.println("開けたら閉める!"); }
    
    public TimerClient getDoorTimerAdapter() {
        return new DoorTimerAdapter(this);
    }
}

class DoorTimerAdapter implements TimerClient {
    TimedDoor itsTimedDoor;
    
    DoorTimerAdapter(TimedDoor timedDoor) {
        this.itsTimedDoor = timedDoor;
    }
    
    public void timeout() {
        itsTimedDoor.timeout();
    }
}

class TimerImpl extends Timer {
    /* ここは不変のため省略 */
}

public class InterfaceSegregationPrincipleTest {

    public static void main(String[] args) {
        TimedDoor door = new TimedDoor();
        Timer timer = new TimerImpl();
        
        timer.register(3000, door.getDoorTimerAdapter());
        //door.unlock();
        //door.lock();
    }
}