λμμΈ ν¨ν΄μ λνμ΄λλ λ¬Έμ λ€μ λν μΌλ°μ μ΄κ³ μ¬μ¬μ©κ°λ₯ν ν΄κ²°μ± μ΄λ€. κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μ μ νμ μΈ νΉμ§μΈ λμμΈ ν¨ν΄μ μλ°μ λ£¨λΉ μΈκ³μ λ§μ μ΄λ€μκ² μΉμν 곡ν΅λ μ©μ΄λ₯Ό μ 곡νλ€.
λ€λ₯΄κ² 보면, ν¨ν΄μ μ₯ν©ν¨κ³Ό λνμ΄μ μμ²μΌ μλ μλ€. μ΄ μ μ λν΄μ, ν΄ κ·Έλ μ΄μμ μ΄λ€ μΈμ΄μμ λμμΈ ν¨ν΄μ μ‘΄μ¬μ μ¬μ©μ λ¬Έμ λ₯Ό μμ½κ² νΌ κ²°λ‘ μ΄λΌκΈ° λ³΄λ€ κ·Έ μΈμ΄ μ체μ λν μ½μ μ λνλ΄λ κ²μ΄λΌκ³ νν λ° μλ€.
λ΄κ° λ΄ νλ‘κ·Έλ¨μμ ν¨ν΄μ λ³Ό λ, λλ κ·Έκ²μ΄ λ¬Έμ μ μ§νλΌκ³ μκ°νλ€. νλ‘κ·Έλ¨μ νμμ μ€λ‘μ§ νμ΄μΌ ν λ¬Έμ λ§μ
λ°μν΄μΌ νλ€. μ½λμ μλ μ΄λ€ λ€λ₯Έ κ·μΉμ±λ μ μ΄λ λμκ²λ λ΄κ° μΆ©λΆν κ°λ ₯νμ§ μμ μΆμμ±μ μ¬μ©νκ³ μλ€λ μ§νμ΄λ€.
-- ν΄ κ·Έλ μ΄μ, http://www.paulgraham.com/icad.html
κ·Έλ μ΄μμ μ΄κ²μ μμμ± μ²«λ²μ§Έ μ¬λμ μλμλ€. μΌλ§ μ μ νΌν° λ ΈλΉ μ Lispμ΄ νΉν λλΆλΆμ λμμΈ ν¨ν΄μ λ¨μννκ±°λ 보μ΄μ§ μκ² λ§λ λ€κ³ μκ°νλ€.(http://www.novig.com/design-patterns/) ν΄λ‘μ λ μ΄ μ ν΅μ μ§μνλ€. μΌκΈ ν¨μ, λμ νμ΄ν, κ·Έλ¦¬κ³ λΆλ³ κ°λ€ κ°μ κ°λ ₯ν μμ±λ¬Ό λλΆμ, κ°μ₯ μΌλ°μ μΈ λμμΈ ν¨ν΄λ€μ λ§μ κ²λ€μ΄ μλ©Έλλ€. κ·Έλ¦¬κ³ , ν΄λ‘μ λ μ¬λ¬λΆμκ² μ¬λ¬λΆμ΄ μ€μ€λ‘ μμ©κ΅¬λ₯Ό λ§λλ κ²μ νΌνλλ° νμν λꡬλ€μ λ§€ν¬λ‘μ ν¨κ» μ 곡νλ€.
μΌλ°μ μΈ λ€μμΈ ν¨ν΄λ€μ ν¬κ΄νλ ν΄λ‘μ μ½λ μμ λ€μ μ΄ μ± μ λ°μ κ±Έμ³ ν©μ΄μ Έ μλ€.
Listener, Observer. μΌκΈ ν¨μμ λμ νμ΄νμ ν¬μλμΈ μ΄λ€μ κ·Έμ κ΄λ ¨λ μ΄λ²€νΈκ° λ°μν λ νΈμΆλλ ν¨μλ€μ΄λ€. μ΄λ° μ΄λ²€νΈλ 176νμ΄μ§μ "κ°μ"μ μλ λ νΌλ°μ€λ€ νμ
λ€μ λν κ°μμλ‘ κ΄μ°°λ μλ μλ€. λ νΌλ°μ€ νμ
λ€ μ΄μΈμ, λΆλ³ κ°μ μ°μ μ μΈ μ¬μ©μ μ¬λ¬λΆμ΄ μΆμ ν νμκ° μλ κ°λ³μ μΈ κ²λ€μ λ²μ£Όκ° κ΅μ₯ν μ΅μνλλ€λ κ²μ μλ―Ένλ€.
Abstract Factory, Strategy, Command. λ§μ½ μ¬λ¬λΆμ΄ μ΄λ€ μ νμ κΈ°λ₯μ ꡬν체λ€μ μ¬λ¬κ° κ°μ§κ³ μλ€λ©΄--λ¬λΌμ§λ νμ μ΄λ μ€μ μ κ°μ μμ°νλμ§, μλλ©΄ μκ³ λ¦¬μ¦μ λ³νλ₯Ό ꡬννλμ§ μκ΄μμ΄--FactoryFactoryλ μ¬λ¬λΆμ μκ³ λ¦¬μ¦ κ΅¬ν체λ₯Ό νΈμΆνκΈ° μν λ§₯λ½μ μμ°ν νμκ° μλ€. λ κ°μ§ κ²½μ° λͺ¨λ, κ·Έλ₯ λ€λ₯Έ ν¨μκ° ν κ²μ΄λ€.
Iterator. Iteratorλ 89νμ΄μ§μ "μνμ€"μμ μ€λͺ λ μνμ€μ μνμ¬ μμ ν ν¬κ΄λλ€(be supersetted), κ·Έλμ Iteratorλ map κ°μ ν¨μλ€μ ν΅νμ¬ μ μ λ Έλ ₯μΌλ‘ μ μΈμ μΌλ‘ μ¬μ©λλ€.
Adapter, Wrapper, Delegate. λ€λ₯Έ κ³³μμ μ΄λ€μ μ μ°νμ§ μμ νμ κ³μΈ΅κ΅¬μ‘° λλ¬Έμ νμμ±μ΄ μκΈ°λλ°, νλ‘ν μ½μ΄ μ΄λ€μ νμμκ² λ§λ λ€. νλ‘ν μ½μ μ¬λ¬λΆμ΄ μμμ΄λ adaptaionμ΄λ λνμ νΈμνμ§ μκ³ λ κΈ°μ‘΄ νμ μ μλ‘μ΄ νλμ λ³λλ‘ μ μνκ² ν΄μ€λ€.
Memento. κ°μ²΄μ κ°λ³μ± μμ 곡ν΅λ APIλ₯Ό κ³μΈ΅ννλ κ²μ λ¬Έμ λ€μ κ°μ₯ κΈ°κ³μ μΈ λΆλΆμ ν΄κ²°νμ§λ§(API μΌλ°ν), κ°λ³ μν μ체μ λλλ¬μ§ 볡μ‘μ±μ ν΄κ²°νμ§λ λͺ»νλ€. λΆλ³ 컬λ μ κ³Ό λ μ½λλ€μ μ΄ μ λ΅μ λ€μ§μλ€. κ°λ³ μνλ κ°μμ μ μΈλκ³ , κ·Έ κ°λ€μ μ΄μ λ²μ λ€μ 보κ΄νλ κ²μ λΉμ©μ΄ μ κ² λ€κ³ μ¬μ°λ©°, μν λ³νλ λ νΌλ°μ€ νμ μ λ¨κ²¨ μ§λ€.(κ°κ°μ λ νΌλ°μ€ νμ μ κ°κ°μ λμμ±κ³Ό λ³ν μλ―Έλ‘ μ μ ν©ν λ€λ₯Έ APIλ₯Ό μ 곡νλ€.)
Template Method. ν΄λμ€ μμμ μ νμ μ μλ €μ Έ μμΌλ©° λ§€μΌ μμ²λ§ λͺ μ΄ λλΌμ§λ§, ν΄λμ€ μμμ λ§μ μΈμ΄λ€μμ κΈ°λ₯μ μ‘°ν©νλ μ μΌν λ°©λ²μΌλ‘ λΉλ²νκ² μμ§κΉμ§ λ리 μ¬μ©λλ€. μ΄ λ―Έμ¬μ©μ κ΄μ¬μ νΌν©μ κ³ μ°¨ ν¨μλ‘ λ μ μ¬κ΅¬μ±λλ€. κ³ μ°¨ ν¨μλ λ€μν νμλ₯Ό ꡬννλ κ²κ³Ό λμμ 곡μ λ κΈ°λ₯μ κ·λ²μ μΈ κ΅¬νμ μ 곡νλ ν¨μλ€μ μμ©ν μ μλ€. μλ₯Ό λ€μ΄, μ°λ¦¬κ° λ§μ½ μ΄λ€ μ΄ν리μΌμ΄μ λ΄λΆμ λ°μ΄ν° ꡬ쑰μ κΈ°λ°ν λ€λ₯Έ 곡κΈμλ€μ΄ μ 곡νλ λμΌν HTTP APIλ€μ νΈμΆ κ°λ₯νκ² λλ κ²μ΄ νμνλ€λ©΄, κ³ μ°¨ ν¨μκ° κ³΅κΈμμ νΉνλ κΈ°λ₯μ λ³λμ ν¨μλ‘ μ μνκ² ν΄μ£Όλ©°, λμμ λ²μ© HTTP λ°°κ΄μ ν κ³³μμ μ μ§νλ€.
(defn- update-status*
[service-name service-endpoint-url request-data-fn]
(fn [new-status]
(log (format "Updating status @ %s to %s" service-name new-status))
(let [http-request-data (request-data-fn new-status)
connection (-> service-endpoint-url java.net.URL. .openConnection)]
;; ...set request method, parameters, body on `connection`
;; ...perform actual request
;; ...return result based on HTTP response status
)))
(def update-facebook-status (update-status* "Facebook" "http://facebook.com/apis/..."
(fn [status]
{:params {:_a "update_status"
:_t status}
:method "GET"})))
(def update-twitter-status ...)
(def update-google-status ...)λ€λ₯Έ 곡ν΅λ ν¨ν΄λ€μ μ’ λ μμΈν ν보λλ‘ νμ. κ·Έ ν¨ν΄λ€ μ€ μΌλΆλ μ§κΈ λ€λ₯Έ μΈμ΄λ€μμ 보νΈμ μΈ νλ‘κ·Έλλ° μ°μ΅μΌλ‘ κ·Έλ κ² κ΅¬μμ§λλ°, κ·Έλ€μ λ€μ μ λ³νλλ°λ μΆκ° μμ μ΄ νμν μ μλ€.
λ§μ κ°μ²΄ μ§ν₯ μΈμ΄λ€μμ, μμ‘΄μ± μ£Όμ μ κ·Έ ν΄λμ€κ° μμ‘΄νκ³ μλ λ€λ₯Έ κ°μ²΄λ‘λΆν° ν΄λμ€λ₯Ό λΆλ¦¬νλ λ°©λ²μ΄λ€. κ°μ²΄κ° λ€λ₯Έ κ°μ²΄λ€μ λ΄λΆμ μΌλ‘ μ΄κΈ°ννλ λμ μ, κ°μ²΄λ κ·Έλ€ κ°μ²΄λ€μ μΈμλ‘μ¨ λ°μλ€μΈλ€. κ·Έλ€ μΈμλ μ’ μ’ μ€ν μκ°μ νλ€μ΄μ§ μκ³ μμκ°μ μ 곡λκ±°λ μ¬λ¬λΆμ νλ‘κ·Έλ¨μ νΈμ€ν νλ μ΄ν리μΌμ΄μ 컨ν μ΄λμ μν΄ μμκ°μ μ 곡λλ€.
μλ° κ°μ μ μ μΈμ΄μμ, μ΄κ²μ μ½ν¬λ¦¬νΈ ν΄λμ€ λ³΄λ€λ μΈν°νμ΄μ€λ‘ μμ±νλ κ²μ μν΄ μ±μ·¨λλ€. μ΄ κ΅¬νμ μ λΉμΏΌν°μ€ μ μλλ¬Ό κ°κ² 컨μ μΌλ‘ μκ°ν΄λ³΄μ.
interface IDog {
public String bark();
}
class Chihuahua implements IDog {
public String bark() {
return "Yip!";
}
}
class Mastiff implements IDog {
public String bark() {
return "Woof!";
}
}
class PetStore {
private IDog dog;
public PetStore() {
this.dog = new Mastiff();
}
}
public IDog getDog() {
return dog;
}
static class MyApp {
public static void main(String[] args) {
PetStore store = new PetStore();
System.out.println(store.getDog().bark());
}
}μ°λ¦¬μ μ μλλ¬Ό κ°κ²λ λ§μ€ν°νλ§ μ·¨κΈνλ€. λ§μ½ μ°λ¦¬κ° λ€λ₯Έ μ’ λ₯μ κ°λ€μ μ·¨κΈνκ² κ°κ²λ₯Ό λ°κΎΈκ³ μΆλ€λ©΄, μ°λ¦¬λ PetStroe ν΄λμ€λ₯Ό κ³ μ³μ λ€μ μ»΄νμΌν΄μΌλ§ νλ€. PetStoreλ₯Ό μ’ λ μ¬μ¬μ©κ°λ₯νκ² λ§λ€λ €λ©΄, PetStoreλ₯Ό λ€μ μ²λΌ μ¬μμ±ν μ μλ€.
class PetStore {
private IDog dog;
public PetStore(IDog dog) {
this.dog = dog;
}
public IDog getDog() {
return dog;
}
}
class MyApp {
public static void main(String[] args) {
PetStore store = new PetStore(new Chihuahua());
System.out.println(store.getDog().bark());
}
}μ΄μ κ°κ²μ κ° μ’ λ₯λ μΈμν λμλ€. νΉμ μ νμ κ°λ PetStoreμ μμ±μλ₯Ό ν΅ν΄ "μ£Όμ "λλ€. PetStoreλ μ°λ¦¬κ° λ€λ₯Έ κ°λ₯Ό μ·¨κΈνκ³ μΆμ λ λ§λ€ λ€μ μ»΄νμΌν νμκ° μμ κ²μ΄λ€. μ¬μ§μ΄ μ°λ¦¬λ PetStoreκ° μμ±λ λ μ‘΄μ¬νμ§ μμλ ν΄λμ€λ€κ³Ό ν¨κ» PetStoreλ₯Ό μ¬μ©ν μλ μλ€. λ¨μ§ IDog μΈν°νμ΄μ€λ₯Ό ꡬννκΈ°λ§ νλ©΄ λλλ€. μ΄κ²μ μλ₯Ό λ€μ΄, μ°λ¦¬κ° μ½κ² ν μ€νΈλ₯Ό μν Mock κ° νμ λ€μ μμ±νκ² ν΄μ€λ€. μμ‘΄μ± μ£Όμ μ λ³΄ν΅ μ»¨ν μ΄λμ μν΄ μ΄λ£¨μ΄μ§λ€. 컨ν μ΄λλ μ€νμκ° μ€μ μ μ¬μ©νμ¬ κ·Έ ν΄λμ€ κ²½λ‘μμ μλμ μΌλ‘ λ°κ²¬λκ±°λ κ·Έ μ€μ μ λͺ μλ μΈν°νμ΄μ€ ꡬν체λ€κ³Ό ν¨κ» ν€ κ°μ²΄λ€μ μλμ μΌλ‘ μ΄κΈ°ννλ€. μ€ν μκ° μ€μ μ΄ μ¬λ¬λΆμ΄ ν¨κ» μμ νλ 컨ν μ΄λ ꡬν체μ μμ‘΄ν λ, μ΄ μ€μ μ λ³΄ν΅ λ³λλ‘ κ΄λ¦¬λλ μ€μ μ½λμ μ§ν© λλ XML νμΌλ€μ ννλ₯Ό μ·¨νλ€. ν΄λ‘μ λ μ΄ λ¬Έμ λ₯Ό λ€μ§λλ€. barkκ° μλ°μμλ μ°λ¦¬μ IDog ν΄λμ€μ μν΄ μ μλ λ©μλμΈ κ²μ λΉνμ¬, ν΄λ‘μ μ½λλ barkλ₯Ό μ΄λ€ μ½ν¬λ¦¬νΈ νμ λ€λ‘λΆν° λΆλ¦¬λ νλ‘ν μ½ λ©μλλ‘ μ μνλ€.
(defprotocol Bark
(bark [this]))
(defrecord Chihuahua [weight price]
Bark
(bark [this] "Yip!"))
(defrecord Mastiff []
Bark
(bark [this] "Woof!"))μ΄μ , μ°λ¦¬μ μ μλλ¬Ό κ°κ²λ λ€μ μ²λΌ 보μ΄κ² λ κ²μ΄λ€.
(defrecord PetStore [dog])
(defn main
[dog]
(let [store (PetStore. dog)]
(println (bark (:dog store)))))
(main (Chihuahua.))
;= Yip!
(main (Mastiff.))
;= Woof!κ·Έλ, λ°λ‘ μ΄κ±°λ€! PetStoreμ μ΄μ ν μ€μ§λ¦¬ μ½λκ° λλ€.