Hatena::ブログ(Diary)

winplusの日記 このページをアンテナに追加 RSSフィード

2009-10-08

デザインパターンでFizzBuzz

この前の「楽しいアプリ制作の会 #07」の テーマが「デザインパターン(続)」だった。

タイミングよく、 FizzBuzz ループ→再帰→Composite→Strategy→Visitor - プログラマーの脳みそを見かけた。

で、ひとつやってみた。「楽しいアプリ制作の会」でもIF文の連鎖が話題になったので、それを解消するために、Chain Of Responsibilityを採用。

「Chain」にするために、まず、以下のクラスを作成する。

public abstract class Responsible {
	private Responsible next = null;
	
	public Responsible setNext(Responsible next) {
		this.next = next;
		return  next;
	}
	
	public void answer(int number) {
		if (canAnswer(number)){
			printAnswer(number);
		}else if (next != null){
			next.answer(number);
		}
	}
	
	public abstract boolean canAnswer(int number);
	public abstract void printAnswer(int number);
}

つぎにこれを継承して、応答する各クラスを作成する。

public class FizzBuzz {
	public boolean canAnswer(int number){
		return ( (number % 3 == 0) && (number % 5 == 0) );
	}
	public void printAnswer(int number) {
		System.out.println("FizzBuzz");
	}
}
public class Fizz {
	public boolean canAnswer(int number){
		return (number % 3 == 0);
	}
	public void printAnswer(int number) {
		System.out.println("Fizz");
	}
}
public class FizzBuzz {
	public boolean canAnswer(int number){
		return (number % 5 == 0);
	}
	public void printAnswer(int number) {
		System.out.println("Buzz");
	}
}
public class Start {
	public boolean canAnswer(int number){
		false;
	}
	public void printAnswer(int number) {
		//
	}
}
public class Stop {
	public boolean canAnswer(int number){
		true;
	}
	public void printAnswer(int number) {
		System.out.println(String.valueOf(number));
	}
}

さいごに、これらを「Chain」にして、呼び出せばよい。

public class FizzBuzzGame{
	public static void main(String[] args) {
		new FizzBuzzGame().process();
	}
	
	public void process() {
		Responsible start = new Start();
		Responsible fizzBuzz = new FizzBuzz();
		Responsible fizz = new Fizz();
		Responsible buzz = new Buzz();
		Responsible stop = new Stop();
		start.setNext(fizzBuzz).setNext(fizz).setNext(buzz).setNext(stop);
		
		for (int number = 1; number <= 100; number++) {
			start.answer(number);
		}
	}
}

IF文がほとんど消えたし、まあ、いいんじゃないでしょうか。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/winplus/20091008/1255009050