模式6-替代模板方式模式

来源:互联网 发布:云计算和超级计算机 编辑:程序博客网 时间:2024/05/01 01:03
目的: 替代模板方式模式(模板方式模式-指定算法大致轮廓,并让调用者完成对某些细节的插入)模板方法模式定义了一个算法的步骤,并允许次类别为一个或多个步骤提供其实践方式。让次类别在不改变算法架构的情况下,重新定义算法中的某些步骤。在软件工程中,它是一种软件设计模式,和C++模板没有关连。(ns org.liango.oo.template.制作评分报表)(defn make-grade-report {                         :doc "制作评分报表"                         }  [num-to-letter print-grade-report]  (fn [grades]    (print-grade-report (map num-to-letter grades)))  );; 1(defn num-to-letter {                     :doc "评分转换"                     }  [n]  (cond    (and (<= n 5.0) (> n 4.0)) "A"    (and (<= n 4.0) (> n 3.0)) "B"    (and (<= n 3.0) (> n 2.0)) "C"    (and (<= n 2.0) (> n 0.)) "D"    (= n 0) "F"    :else "NaN"    )  )(defn print-grade-report {                          :doc "分组打印直方图"                          }  [grades]  (let [grouped-arrs (group-by identity grades)        grade-count-map (sort (map (fn [[one-of-grouped-arr grouped-arr]] [one-of-grouped-arr (count grouped-arr)]) grouped-arrs))        ]    (doseq [[grade count] grade-count-map]      (println (str grade " : " (apply str (repeat count "*"))))      )    )  );; test1(def grades [5.0 4.0 4.4 2.2 3.3 3.5])(def full-grade-report (make-grade-report num-to-letter print-grade-report))(full-grade-report grades);;=>输出;;A : **;;B : ***;;C : *;; 2 换一种细节插入(defn num-to-letter-2 {                     :doc "评分转换"                     }  [n]  (cond    (and (<= n 5.0) (> n 4.7)) "A"    (and (<= n 4.7) (> n 4.3)) "A-"    (and (<= n 4.3) (> n 4.0)) "B+"    (and (<= n 4.0) (> n 3.7)) "B"    (and (<= n 3.7) (> n 3.3)) "B-"    (and (<= n 3.3) (> n 3.0)) "C+"    (and (<= n 3.0) (> n 2.7)) "C"    (and (<= n 2.7) (> n 2.3)) "C-"    (and (<= n 2.3) (> n 0)) "D"    (= n 0) "F"    :else "NaN"    )  )(defn print-grade-report-2 {                          :doc "依次打印"                          }  [grades]  (doseq [grade grades] (println "grade is" grade))  )(def full-grade-report-2 (make-grade-report num-to-letter-2 print-grade-report-2))(full-grade-report-2 grades);;=>输出;;grade is A;;grade is B;;grade is A-;;grade is D;;grade is C+;;grade is B-
0 0