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.0107 sec