E D R , A S I H C RSS

Pluggable Selector

Pluggable Selector

๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ฒŒ Pluggable Behavior๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์‹คํ–‰๋  ํ–‰๋™์„ ์ €์žฅํ•ด๋†“๋Š” ๊ฒƒ์ด๋‹ค. ๋จผ์ € ์ด๊ฒƒ์˜ ๋ฐ˜๋ก€, ์ฆ‰ ์„œ๋ธŒํด๋ž˜์‹ฑ ํ•œ๊ฒƒ์„ ๋ณด์ž.
~cpp 
class ListPane
{
public:
	Type printElement(Object& anObject) {
		return anObject.printString();
	}
};

class DollarListPane : public ListPane
{
public:
	Type printElement(Object& anObject) {
		return anObject.asDollarFormatString();
	}
};

class DiscriptionListPane : public ListPane
{
public:
	Type printElement(Object& anObject) {
		return anObject.desription();
	}
};

์ด๋Ÿฐ์‹์œผ๋กœ ํ•˜๋‚˜์˜ ๋ฉ”์†Œ๋“œ๋งŒ ๊ณ„์† ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•œ๋‹ค๋ฉด ์„œ๋ธŒํด๋ž˜์Šค๋“ค์˜ ๊ฐ€์น˜๊ฐ€ ์—†์„๊ฒƒ ๊ฐ™๋‹ค. ์‰ฌ์šด ํ•ด๊ฒฐ์ฑ…์€ ListPane ์Šค์Šค๋กœ๋ฅผ ์ข€ ๋” ์œ ์—ฐํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค. ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋“ค์ด ๋‹ค๋ฅธ ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ด๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
~cpp 
class ListPane
{
private:
	void (ListPane::*printMessage)();
public:
	Type printElement(Object& anObject) {
		return anObject.perform(printMessage);
	}
	void initialize() {
		printMessage = printString;	// printString์€ ์–ด๋”˜๊ฐ€์— ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค.
	}
};
๊ฐ€๋…์„ฑ : ๊ทธ๋ƒฅ ์„œ๋ธŒํด๋ž˜์‹ฑํ•œ๊ฒƒ๋ณด๋‹ค ๋–จ์–ด์ง„๋‹ค.
์œ ์—ฐ์„ฑ : P.S๋Š” ์ˆ˜์‹  ๊ฐ์ฒด์— ๊ตฌํ˜„๋˜์–ด์•ผ ํ•œ๋‹ค.
ํ™•์žฅ์„ฑ : ํ•œ ์˜ค๋ธŒ์ ํŠธ๋งˆ๋‹ค ์ตœ๋Œ€ ๋‘๋ฒˆ๊นŒ์ง€๋งŒ ์“ฐ์ž. ๋” ๋งŽ์ด ์“ฐ๋ฉด ํ”„๋กœ๊ทธ๋žจ์˜ ์˜๋„๊ฐ€ ํ๋ ค์ง„๋‹ค. ๋” ๋งŽ์ด ์“ฐ๊ณ  ์‹ถ์œผ๋ฉด State Object๋ฅผ ์“ฐ๋Š” ๋ฒ•์ด ์žˆ๋‹ค.

์‹คํ–‰๋  selector๋ฅผ ๊ฐ€์ง€๋Š” ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ์ด๋ฆ„ ๋’ค์— Message๋ฅผ ๋ง๋ถ™์ธ๋‹ค. selector๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ํ•ด์ฃผ๋Š” Composed Method๋ฅผ ๋งŒ๋“ ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์–ด๋–ค ๋น„์ฅฌ์–ผํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค๋ฅธ ๊ฒƒ์˜ ์ƒ๋Œ€์ ์ธ ๋ถ€๋ถ„์— ์œ„์น˜์‹œํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด, ์ƒ๋Œ€์ ์ธ ์œ„์น˜๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” Pluggable Selector๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.(???)
~cpp 
class RelativePoint
{
public:
	static RelativePoint* centered(Figure& aFigure) {
		RelativePonit* rp = new RelativePoint;
		rp->setFigurenMessage(aFigure, center);		
	}
	void setFigurenMessage(Figure& aFigure, int aSymbol()) {
		figure = aFigure;
		locationMessage = aSymbol;
	}
};
์ด์ œ ์ผ๋ฐ˜ Point์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
~cpp 
Point RelativePoint::asPoint()
{
	return figure.perform(locationMessage);
}

Point RelativePoint::x()
{
	return asPoint().x();
}
์ด๋Ÿฐ ์‹์œผ๋กœ ํ•˜๋ฉด CenteredRelativePoint, TopLeftRelativePoint๊ฐ™์€ ์„œ๋ธŒํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†๋‹ค. ์œ„์—์„œ center๋ผ๋Š” ๋ฉ”์„ธ์ง€๋ฅผ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ, topLeft๋ฉ”์„ธ์ง€๋ฅผ ์ถ”๊ฐ€๋งŒ ํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:24:00
Processing time 0.0046 sec