Skip to content

Instantly share code, notes, and snippets.

@takeouchida
Created November 14, 2013 17:41
Show Gist options
  • Save takeouchida/7471061 to your computer and use it in GitHub Desktop.
Save takeouchida/7471061 to your computer and use it in GitHub Desktop.
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