デコレーションモード

2486 ワード

//Purpose.  Decorator design pattern

//1. Create a "lowest common denominator" that makes classes interchangeable
//2. Create a second level base class for optional functionality
//3. "Core" class and "Decorator" class declare an "isa" relationship
//4. Decorator class "hasa" instance of the "lowest common denominator"
//5. Decorator class delegates to the "hasa" object
//6. Create a Decorator derived class for each optional embellishment
//7. Decorator derived classes delegate to base class AND add extra stuf
//8. Client has the responsibility to compose desired configurations

interface Widget {
	void draw();
} // 1. "lowest common denominator"

class TextField implements Widget { // 3. "Core" class with "isa" rel
	private int width, height;

	public TextField(int w, int h) {
		width = w;
		height = h;
	}

	public void draw() {
		System.out.println("TextField: " + width + ", " + height);
	}
}

// 2. Second level base class
abstract class Decorator implements Widget { // with "isa" relationship
	private Widget wid; // 4. "hasa" relationship

	public Decorator(Widget w) {
		wid = w;
	}

	public void draw() {
		wid.draw();
	} // 5. Delegation
}

class BorderDecorator extends Decorator { // 6. Optional embellishment
	public BorderDecorator(Widget w) {
		super(w);
	}

	public void draw() {
		super.draw(); // 7. Delegate to base class
		System.out.println("   BorderDecorator"); // and add extra stuff
	}
}

class ScrollDecorator extends Decorator { // 6. Optional embellishment
	public ScrollDecorator(Widget w) {
		super(w);
	}

	public void draw() {
		super.draw(); // 7. Delegate to base class
		System.out.println("   ScrollDecorator"); // and add extra stuff
	}
}

public class DecoratorDemo {
	public static void main(String[] args) {
		// 8. Client has the responsibility to compose desired configurations
		Widget aWidget = new BorderDecorator(new BorderDecorator(
				new ScrollDecorator(new TextField(80, 24))));
		aWidget.draw();
	}
}