インターフェイス分離の原則(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(); } }