Created
November 14, 2013 17:41
-
-
Save takeouchida/7471061 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package sandbox; | |
import java.util.HashSet; | |
import java.util.Set; | |
enum 音 { | |
猫の鳴き声, 犬の鳴き声, ツクツクホウシの鳴き声 // などなど... | |
} | |
interface 聞く者 { | |
void 聞く(音 sound); | |
String 名前(); | |
} | |
class ふつうの人 implements 聞く者 { | |
public void 聞く(音 sound) { | |
switch (sound) { | |
case 猫の鳴き声: | |
System.out.println("ふつうの人: 猫が鳴いている."); | |
break; | |
case 犬の鳴き声: | |
System.out.println("ふつうの人: 犬が鳴いている."); | |
break; | |
default: | |
System.out.println("ふつうの人: なんの音だろう?"); | |
} | |
} | |
public String 名前() { | |
return "ふつうの人"; | |
} | |
public boolean equals(Object o) { | |
return o instanceof ふつうの人; | |
} | |
} | |
class 動物を知らない人 implements 聞く者 { | |
public void 聞く(音 sound) { | |
System.out.println("動物を知らない人: なんの音だろう?"); | |
} | |
public String 名前() { | |
return "動物を知らない人"; | |
} | |
public boolean equals(Object o) { | |
return o instanceof 動物を知らない人; | |
} | |
} | |
class 部屋 { | |
private Set<聞く者> listeners = new HashSet<>(); | |
public void 入る(聞く者 listener) { | |
if (!listeners.contains(listener)) { | |
System.out.println(listener.名前() + "が入室した."); | |
listeners.add(listener); | |
} | |
} | |
public void 出る(聞く者 listener) { | |
if (listeners.contains(listener)) { | |
System.out.println(listener.名前() + "が退室した."); | |
listeners.remove(listener); | |
} | |
} | |
public void 音が伝わる(音 sound) { | |
for (聞く者 listener : listeners) { | |
listener.聞く(sound); | |
} | |
} | |
} | |
interface 鳴く者 { | |
void 鳴く(); | |
} | |
class 猫 implements 鳴く者 { | |
private 部屋 room; | |
public 猫(部屋 room) { | |
this.room = room; | |
} | |
public void 鳴く() { | |
System.out.println("猫: にゃー."); | |
room.音が伝わる(音.猫の鳴き声); | |
} | |
} | |
public class ObjectiveCat { | |
public static void main(String[] args) { | |
部屋 room = new 部屋(); | |
聞く者 listener1 = new ふつうの人(); | |
聞く者 listener2 = new 動物を知らない人(); | |
猫 cat = new 猫(room); | |
room.入る(listener1); | |
cat.鳴く(); | |
room.入る(listener2); | |
room.出る(listener1); | |
cat.鳴く(); | |
room.出る(listener2); | |
cat.鳴く(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment