《大话设计模式》第一章



Similar documents
小菜编程成长记

新・解きながら学ぶJava

untitled

Microsoft Word - 第3章.doc

untitled

Microsoft Word - 01.DOC

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

給 訪 問 員 的 話 親 愛 的 訪 問 員 您 好 : 首 先 歡 迎 您 參 加 本 次 原 住 民 族 就 業 狀 況 家 戶 訪 問 工 作 調 查 訪 問 工 作 就 好 比 自 然 科 學 領 域 裡 的 實 驗 工 作 一 樣, 是 經 驗 研 究 裡 最 基 礎 的 工 作, 對

!

!

!

!

!

!

李跃儿《谁拿走了孩子的幸福》

Microsoft Word - 變形記

Microsoft Word - [术数]《八卦象数与疾病预测》黄鉴.doc

(1) (20) (27) (31) (39) (45) (57) (62) (71) (77) (84) (96) (104) (106) (140) (145) (147) (150) (155) (171) (174) (180)

第 一 章 : 從 中 共 解 放 軍 投 奔 藏 軍 棄 家 從 軍 我 原 名 姜 華 亭, 藏 名 羅 桑 扎 西, 家 在 中 國 山 東 省 萊 陽 縣 九 區 孟 格 莊 村, 父 親 叫 姜 昆, 母 親 叫 李 秀 芳 家 中 以 務 農 為 業 解 放 前 後, 父 親 曾 在 三

构 建 生 态 养 生 和 大 健 康 两 个 新 兴 业 态 ; 发 展 电 商 " 的 "3221" 发 展 战 略, 确 保 公 司 良 性 健 康 发 展 上 市 以 来, 公 司 秉 承 以 人 为 本 求 实 创 新 服 务 社 会 厚 报 股 东 的 经 营 理 念, 发 扬 团 结


Microsoft Word - 成长的痕迹散文集.docx

Microsoft Word - 席慕容散文集.doc

<4D F736F F D20D6D0B9FABDDAC8D5CEC4BBAF2DB5BECCEF2E646F63>

試分析絲綢之路自漢至宋元對中國文化體系的影響

七 以 自 然 風 光 為 紋 飾 第 六 章 中 國 歷 代 民 間 藏 瓷 鑒 定 術 語 第 七 章 中 國 古 瓷 文 獻 選 一 窯 器 說 ( 清 ) 程 哲 著 二 景 德 鎮 陶 歌 序 言 我 與 春 恩 先 生 相 識 經 年, 且 為 同 好, 瓷 道 摯 友 春 恩 為 人

小 女 孩 跟 着 派 洛 斯 一 起 进 来, 羞 怯 一 如 往 常 在 她 身 后 拖 步 轻 跳 古 怪 横 行 的, 则 是 她 的 弄 臣 他 戴 着 一 顶 老 旧 锡 桶 做 的 玩 具 头 盔, 顶 端 捆 了 两 根 鹿 角, 上 面 挂 着 牛 铃, 随 着 他 的 蹒 跚 脚

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii

untitled

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

EJB-Programming-4-cn.doc

Microsoft Word - 補陽食物.doc

将 辣 椒 油 入 锅 烧 热 后, 将 以 上 各 种 调 料 入 锅, 锅 内 小 火 慢 慢 熬 制, 直 到 香 味 四 溢, 色 泽 红 亮, 才 能 起 锅 装 入 罐 中, 随 用 随 取 即 可 菜 例 有 粤 式 香 辣 蟹 香 辣 串 串 虾 二 川 椒 汁 调 味 品 用 量

untitled

!

!

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

Untitled

./ /

如 果 用 一 句 话 来 概 括,2013 年 职 业 院 校 特 别 是 中 等 职 业 学 校 就 业 持 续 向 好, 并 且 保 持 在 较 高 水 平 2013 年 中 职 学 校 的 毕 业 生 就 业 率 是 96.81%, 是 自 2006 年 来 第 八 年 保 持 在 95%


!

chineseall

./

untitled

小 说 天 地 欲 望 摩 托 尚 成 河 血 溅 维 纳 斯 刘 步 明 长 调 短 歌 海 上 天 湖 李 转 生 目 海 尖 高 处 的 三 种 陈 述 谢 应 华 乡 村 笔 记 阿 曼 桃 花 渡 林 小 耳 种 诗 歌 江 良 热 雨 花 石 张 彩 霞 刊 名 书 法 陈 奋 武 屏

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

活 动 虽 然 简 朴 而 天 真, 但 它 的 竞 技 形 式 对 后 世 有 着 深 远 的 影 响. 到 了 城 邦 时 期 的 雅 典, 已 经 特 别 重 视 对 奴 隶 主 子 弟 的 体 育, 智 育, 德 育 和 美 育 的 和 谐 教 育. 孩 子 们 到 了 13 岁, 就 升

序 屈 指 数 来, 柔 情 滑 落 指 尖 : 是 父 母 给 了 我 们 生 命, 是 家 人 给 了 我 们 亲 情, 是 朋 友 给 了 我 们 友 谊 ; 是 不 幸 给 了 我 们 成 熟, 是 挫 折 给 了 我 们 坚 定 ; 是 苦 难 给 了 我 们 刚 毅, 是 逆 境 给 了

chp6.ppt

** 状 态 二 亚 健 康 亚 健 康 是 指 处 于 健 康 和 疾 病 两 者 之 间 的 一 种 状 态 即 机 体 内 出 现 某 些 功 能 紊 乱 但 未 影 响 到 行 使 社 会 功 能 主 观 上 有 不 适 感 觉 它 是 人 体 处 于 健 康 和 疾 病 之 间 的 过 渡


!

!

全国计算机技术与软件专业技术资格(水平)考试

gongGaoMingCheng

JavaIO.PDF

使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款

untitled

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,

untitled

<4D F736F F D20C8EDC9E82DCFC2CEE7CCE22D3039C9CF>

中 国 中 西 医 结 合 杂 志 年 月 第 卷 第 期!"# $! 症 状 在 诊 断 时 推 荐 应 用 $3 的 症 状 指 数 $!0 " 0 %!2 3% ". )./!0 ) 1/! 5 1! 0 %7$3 6 进 行 基 础 评 估 和 治 疗 监 测 心 理 状 况 的 评 估 可

Microsoft Word - wz.doc

A """ 明 通 "" 調 胃 承 氣 湯 濃 縮 散 " A 復 旦 十 神 湯 濃 縮 散 A """ 明 通 "" 竹 茹 溫 膽 湯 濃 縮 散 " A 明 通 五 皮 飲 濃 縮 散 A 明 通 香 砂 六 君 子 湯 濃 縮

A """ 順 天 堂 "" 白 薇 濃 縮 顆 粒 " A """ 順 天 堂 "" 萹 蓄 濃 縮 顆 粒 " A """ 順 天 堂 "" 骨 碎 補 濃 縮 顆 粒 " A """ 順 天 堂 "" 訶 子 濃 縮 顆 粒 " A

A A A A A A A A A A A A A A A A A A A00206

1 Framework.NET Framework Microsoft Windows.NET Framework.NET Framework NOTE.NET NET Framework.NET Framework 2.0 ( 3 ).NET Framework 2.0.NET F

6寸PDF生成工具

海南大学 琼州大学.doc

gongGaoMingCheng

内 容 简 介 本 书 是 一 本 关 于 语 言 程 序 设 计 的 教 材, 涵 盖 了 语 言 的 基 本 语 法 和 编 程 技 术, 其 中 包 含 了 作 者 对 语 言 多 年 开 发 经 验 的 总 结, 目 的 是 让 初 学 的 读 者 感 受 到 语 言 的 魅 力, 并 掌

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

<4D F736F F D20BECDD2B5D6CAC1BFC4EAB6C8B1A8B8E6B6A8B8E5>

工银瑞信精选平衡混合型证券投资基金2008年度第2季度报告

gongGaoMingCheng

证券投资基金信息披露XBRL标引规范第2号<半年度报告摘要>

抗日战争大事记(校)

工银瑞信精选平衡混合型证券投资基金2008年度第2季度报告

gongGaoMingCheng

1 重 要 提 示 基 金 管 理 人 的 董 事 会 及 董 事 保 证 本 报 告 所 载 资 料 不 存 在 虚 假 记 载 误 导 性 陈 述 或 重 大 遗 漏, 并 对 其 内 容 的 真 实 性 准 确 性 和 完 整 性 承 担 个 别 及 连 带 责 任 基 金 托 管 人 平 安

诗歌.doc


2 WF 1 T I P WF WF WF WF WF WF WF WF 2.1 WF WF WF WF WF WF

破拆救援工具 2015年云南公务员考试申论热点解析:救援队伍职业化


!

新版 明解C++入門編

精 品 库 我 们 的 都 是 精 品 _www.jingpinwenku.com 4 佛 家 弟 子 为 什 么 都 姓 释? 释 姓 是 汉 人 姓 氏 之 一, 一 般 为 汉 传 佛 教 出 家 人 统 一 使 用 之 姓 氏, 并 未 收 录 于 百 家 姓 中 中 国 出 家 人 以 释

158期气齐全.FIT)

!

!

!"# $ %& (( )* +, +,--.+/ " /357 4, 8 -/!+ * * * "+#* * * $* * * % &+ "5/7+99!"#,--6//,.:: / ,,,6,96973,--. / /,--. 7,

!

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應

目 录 招 生 办 法 与 日 程 安 排 年 杭 州 市 区 各 类 高 中 招 生 工 作 日 程 表 杭 州 市 教 育 局 关 于 年 杭 州 市 区 各 类 高 中 招 生 工 作 的 通 知 杭 州 市 教 育 局 关 于 进 一 步 完 善 杭 州 市 区 初 中 学 生 综 合 素

!

《饲料和饲料添加剂管理条例》

Transcription:

第 1 章 代 码 无 错 就 是 优? 简 单 工 厂 模 式 1.1 面 试 受 挫 小 菜 今 年 计 算 机 专 业 大 四 了, 学 了 不 少 软 件 开 发 方 面 的 东 西, 也 学 着 编 了 些 小 程 序, 踌 躇 满 志, 一 心 要 找 一 个 好 单 位 当 投 递 了 无 数 份 简 历 后, 终 于 收 到 了 一 个 单 位 的 面 试 通 知, 小 菜 欣 喜 若 狂 到 了 人 家 单 位, 前 台 小 姐 给 了 他 一 份 题 目, 上 面 写 着 : 请 用 C++ Java C# 或 VB.NET 任 意 一 种 面 向 对 象 语 言 实 现 一 个 计 算 器 控 制 台 程 序, 要 求 输 入 两 个 数 和 运 算 符 号, 得 到 结 果 小 菜 一 看, 这 个 还 不 简 单, 三 下 五 除 二,10 分 钟 不 到, 小 菜 写 完 了, 感 觉 也 没 错 误 交 卷 后, 单 位 说 一 周 内 等 通 知 吧 于 是 小 菜 只 得 耐 心 等 待 可 是 半 个 月 过 去 了, 什 么 消 息 也 没 有, 小 菜 很 纳 闷, 我 的 代 码 实 现 了 呀, 为 什 么 不 给 我 机 会 呢 时 间 :2 月 26 日 20 点 地 点 : 大 鸟 房 间 人 物 : 小 菜 大 鸟 小 菜 找 到 从 事 软 件 开 发 工 作 七 年 的 表 哥 大 鸟, 请 教 原 因, 大 鸟 问 了 题 目 和 了 解 了 小 菜 代 码 的 细 节 以 后, 哈 哈 大 笑, 说 道 : 小 菜 呀 小 菜, 你 上 当 了, 人 家 单 位 出 题 的 意 思, 你 完 全 都 没 明 白, 当 然 不 会 再 联 系 你 了 问 题 小 菜 说 : 我 的 代 码 有 错 吗? 单 位 题 目 不 就 是 要 我 实 现 一 个 计 算 器 的 代 码 吗, 我 这 样 写 有 什 么 class Program static void Main(string[] args) Console.Write(" 请 输 入 数 字 A:"); string A = Console.ReadLine(); Console.Write(" 请 选 择 运 算 符 号 (+ - * /):"); string B = Console.ReadLine(); Console.Write(" 请 输 入 数 字 B:"); string C = Console.ReadLine(); string D = ""; if (B == "+") D = Convert.ToString(Convert.ToDouble(A) + Convert.ToDouble(C)); if (B == "-") D = Convert.ToString(Convert.ToDouble(A) - Convert.ToDouble(C)); if (B == "*") 1

大 话 设 计 模 式 D = Convert.ToString(Convert.ToDouble(A) * Convert.ToDouble(C)); if (O == "/") D = Convert.ToString(Convert.ToDouble(A) / Convert.ToDouble(C)); Console.WriteLine(" 结 果 是 :" + D); 1.2 初 学 者 代 码 毛 病 大 鸟 说 : 且 先 不 说 出 题 人 的 意 思, 单 就 你 现 在 的 代 码, 就 有 很 多 不 足 的 地 方 需 要 改 进 class Program static void Main(string[] args) Console.Write(" 请 输 入 数 字 A:"); string A = Console.ReadLine(); Console.Write(" 请 选 择 运 算 符 号 (+ - * /):"); string B = Console.ReadLine(); Console.Write(" 请 输 入 数 字 B:"); string C = Console.ReadLine(); string D = ""; if (B == "+") D = Convert.ToString(Convert.ToDouble(A) + Convert.ToDouble(C)); if (B == "-") D = Convert.ToString(Convert.ToDouble(A) - Convert.ToDouble(C)); if (B == "*") D = Convert.ToString(Convert.ToDouble(A) * Convert.ToDouble(C)); if (O == "/") D = Convert.ToString(Convert.ToDouble(A) / Convert.ToDouble(C)); Console.WriteLine(" 结 果 是 :" + D); 这 样 命 名 是 非 常 不 规 范 的 判 断 分 支, 你 这 样 的 写 法, 意 味 着 每 个 条 件 都 要 做 判 断, 等 于 计 算 机 做 了 三 次 无 用 功 如 果 除 数 时, 客 户 输 入 了 0 怎 么 办, 如 果 用 户 输 入 的 是 字 符 符 号 而 不 是 数 字 怎 么 办 1.3 代 码 规 范 哦, 说 得 没 错, 这 个 我 以 前 听 老 师 说 过, 可 是 从 来 没 有 在 意 过, 我 马 上 改, 改 完 再 给 你 看 看 2

第 1 章 代 码 无 错 就 是 优? 简 单 工 厂 模 式 class Program static void Main(string[] args) try Console.Write(" 请 输 入 数 字 A:"); string strnumbera = Console.ReadLine(); Console.Write(" 请 选 择 运 算 符 号 (+ - * /):"); string stroperate = Console.ReadLine(); Console.Write(" 请 输 入 数 字 B:"); string strnumberb = Console.ReadLine(); string strresult = ""; switch (stroperate) case "+": strresult = Convert.ToString(Convert.ToDouble(strNumberA) case "-": + Convert.ToDouble(strNumberB)); strresult = Convert.ToString(Convert.ToDouble(strNumberA) case "*": - Convert.ToDouble(strNumberB)); strresult = Convert.ToString(Convert.ToDouble(strNumberA) * Convert.ToDouble(strNumberB)); case "/": if (strnumberb!= "0") else strresult = Convert.ToString(Convert.ToDouble(strNumberA) / Convert.ToDouble(strNumberB)); strresult = " 除 数 不 能 为 0"; Console.WriteLine(" 结 果 是 :" + strresult); Console.ReadLine(); catch (Exception ex) Console.WriteLine(" 您 的 输 入 有 错 :" + ex.message); 3

大 话 设 计 模 式 大 鸟 : 吼 吼, 不 错, 不 错, 改 得 很 快 嘛? 至 少 就 目 前 代 码 来 说, 实 现 计 算 器 是 没 有 问 题 了, 但 这 样 写 出 的 代 码 是 否 合 出 题 人 的 意 思 呢? 小 菜 : 你 的 意 思 是 面 向 对 象? 大 鸟 : 哈, 小 菜 非 小 菜 也! 1.4 面 向 对 象 编 程 小 菜 : 我 明 白 了, 他 说 用 任 意 一 种 面 向 对 象 语 言 实 现, 那 意 思 就 是 要 用 面 向 对 象 的 编 程 方 法 去 实 现, 对 吗?OK, 这 个 我 学 过, 只 不 过 当 时 我 没 想 到 而 已 大 鸟 : 所 有 编 程 初 学 者 都 会 有 这 样 的 问 题, 就 是 碰 到 问 题 就 直 觉 地 用 计 算 机 能 够 理 解 的 逻 辑 来 描 述 和 表 达 待 解 决 的 问 题 及 具 体 的 求 解 过 程 这 其 实 是 用 计 算 机 的 方 式 去 思 考, 比 如 计 算 器 这 个 程 序, 先 要 求 输 入 两 个 数 和 运 算 符 号, 然 后 根 据 运 算 符 号 判 断 选 择 如 何 运 算, 得 到 结 果, 这 本 身 没 有 错, 但 这 样 的 思 维 却 使 得 我 们 的 程 序 只 为 满 足 实 现 当 前 的 需 求, 程 序 不 容 易 维 护, 不 容 易 扩 展, 更 不 容 易 复 用 从 而 达 不 到 高 质 量 代 码 的 要 求 小 菜 : 鸟 哥 呀, 我 有 点 糊 涂 了, 如 何 才 能 容 易 维 护, 容 易 扩 展, 又 容 易 复 用 呢, 能 不 能 具 体 点? 1.5 活 字 印 刷, 面 向 对 象 大 鸟 : 这 样 吧, 我 给 你 讲 个 故 事 你 就 明 白 了 话 说 三 国 时 期, 曹 操 带 领 百 万 大 军 攻 打 东 吴, 大 军 在 长 江 赤 壁 驻 扎, 军 船 连 成 一 片, 眼 看 就 要 灭 掉 东 吴, 统 一 天 下, 曹 操 大 悦, 于 是 大 宴 众 文 武, 在 酒 席 间, 曹 操 诗 性 大 发, 不 觉 吟 道 : 喝 酒 唱 歌, 人 生 真 爽 众 文 武 齐 呼 : 丞 相 好 诗! 于 是 一 臣 子 速 命 印 刷 工 匠 刻 版 印 刷, 以 便 流 传 天 下 样 张 出 来 给 曹 操 一 看, 曹 操 感 觉 不 妥, 说 道 : 喝 与 唱, 此 话 过 俗, 应 改 为 对 酒 当 歌 较 好!, 于 是 此 臣 就 命 工 匠 重 新 来 过 工 匠 眼 看 连 夜 刻 版 之 工, 彻 底 白 费, 心 中 叫 苦 不 迭 只 得 照 办 样 张 再 次 出 来 请 曹 操 过 目, 曹 操 细 细 一 品, 觉 得 还 是 不 好, 说 : 人 生 真 爽 太 过 直 接, 应 改 问 语 才 够 意 境, 因 此 应 改 为 对 酒 当 歌, 人 生 几 何? 当 臣 转 告 工 匠 之 时, 工 匠 晕 倒! 4

第 1 章 代 码 无 错 就 是 优? 简 单 工 厂 模 式 小 菜 你 说, 这 里 面 问 题 出 在 哪 里? 大 鸟 问 道 小 菜 说 : 是 不 是 因 为 三 国 时 期 活 字 印 刷 还 未 发 明, 所 以 要 改 字 的 时 候, 就 必 须 要 整 个 刻 板 全 部 重 新 刻 大 鸟 : 说 得 好! 如 果 是 有 了 活 字 印 刷, 则 只 需 更 改 四 个 字 就 可, 其 余 工 作 都 未 白 做 岂 不 妙 哉 第 一, 要 改, 只 需 更 改 要 改 之 字, 此 为 可 维 护 ; 第 二, 这 些 字 并 非 用 完 这 次 就 无 用, 完 全 可 以 在 后 来 的 印 刷 中 重 复 使 用, 此 乃 可 复 用 ; 第 三, 此 诗 若 要 加 字, 只 需 另 刻 字 加 入 即 可, 这 是 可 扩 展 ; 第 四, 字 的 排 列 其 实 可 能 是 竖 排 可 能 是 横 排, 此 时 只 需 将 活 字 移 动 就 可 做 到 满 足 排 列 需 求, 此 是 灵 活 性 好 而 在 活 字 印 刷 术 出 现 之 前, 上 面 的 四 种 特 性 都 无 法 满 足, 要 修 改, 必 须 重 刻, 要 加 字, 必 须 重 刻, 要 重 新 排 列, 必 须 重 刻, 印 完 这 本 书 后, 此 版 已 无 任 何 可 再 利 用 价 值 小 菜 : 是 的, 小 时 候, 我 一 直 奇 怪, 为 何 火 药 指 南 针 造 纸 术 都 是 从 无 到 有, 从 未 知 到 发 现 的 伟 大 发 明, 而 活 字 印 刷 仅 仅 是 从 刻 版 印 刷 到 活 字 印 刷 的 一 次 技 术 上 的 进 步, 为 何 不 是 评 印 刷 术 为 四 大 发 明 之 一 呢? 原 来 活 字 印 刷 的 成 功 是 这 个 原 因 1.6 面 向 对 象 的 好 处 大 鸟 : 哈, 这 下 你 明 白 了? 我 以 前 也 不 懂, 不 过 做 了 软 件 开 发 几 年 后, 经 历 了 太 多 的 类 似 曹 操 这 样 的 客 户 要 改 变 需 求, 更 改 最 初 想 法 的 事 件, 才 逐 渐 明 白 当 中 的 道 理 其 实 客 观 地 说, 客 户 的 要 求 也 并 不 过 份, 不 就 是 改 几 个 字 吗, 但 面 对 已 完 成 的 程 序 代 码, 却 是 需 要 几 乎 重 头 来 过 的 尴 尬, 这 实 在 是 痛 苦 不 堪 说 白 了, 原 因 就 是 因 为 我 们 原 先 所 写 的 程 序, 不 容 易 维 护, 灵 活 性 差, 不 容 易 扩 展, 更 谈 不 上 复 用, 因 此 面 对 需 求 变 化, 加 班 加 点, 对 程 序 动 大 手 术 的 那 种 无 奈 也 就 成 了 非 常 正 常 的 事 了 之 后 当 我 学 习 了 面 向 对 象 的 分 析 设 计 编 程 思 想, 开 始 考 虑 通 过 封 装 继 承 多 态 把 程 序 的 耦 合 度 降 低, 传 统 印 刷 术 的 问 题 就 在 于 所 有 的 字 都 刻 在 同 一 版 面 上 造 成 耦 合 度 太 高 所 致, 开 始 用 设 计 模 式 使 得 程 序 更 加 的 灵 活, 容 易 修 改, 并 且 易 于 复 用 体 会 到 面 向 对 象 带 来 的 好 处, 那 种 感 觉 应 该 就 如 同 是 一 中 国 酒 鬼 第 一 次 喝 到 了 茅 台, 西 洋 酒 鬼 第 一 次 喝 到 了 XO 一 样, 怎 个 爽 字 可 形 容 呀 是 呀 是 呀, 你 说 得 没 错, 中 国 古 代 的 四 大 发 明, 另 三 种 应 该 都 是 科 技 的 进 步, 伟 大 的 创 造 或 发 现 而 唯 有 活 字 印 刷, 实 在 是 思 想 的 成 功, 面 向 对 象 的 胜 利 小 菜 也 兴 奋 起 来 : 你 的 意 思 是, 面 试 公 司 出 题 的 目 的 是 要 我 写 出 容 易 维 护, 容 易 扩 展, 又 容 易 复 用 的 计 算 器 程 序? 那 该 如 何 做 呀? 5

大 话 设 计 模 式 1.7 复 制 vs. 复 用 大 鸟 : 比 如 说, 我 现 在 要 求 你 再 写 一 个 Windows 的 计 算 器, 你 现 在 的 代 码 能 不 能 复 用 呢? 小 菜 : 那 还 不 简 单, 把 代 码 复 制 过 去 不 就 行 了 吗? 改 动 又 不 大, 不 算 麻 烦 大 鸟 : 小 菜 看 来 还 是 小 菜 呀, 有 人 说 初 级 程 序 员 的 工 作 就 是 Ctrl+C 和 Ctrl+V, 这 其 实 是 非 常 不 好 的 编 码 习 惯, 因 为 当 你 的 代 码 中 重 复 的 代 码 多 到 一 定 程 度, 维 护 的 时 候, 可 能 就 是 一 场 灾 难 越 大 的 系 统, 这 种 方 式 带 来 的 问 题 越 严 重, 编 程 有 一 原 则, 就 是 用 尽 可 能 的 办 法 去 避 免 重 复 想 想 看, 你 写 的 这 段 代 码, 有 哪 些 是 和 控 制 台 无 关 的, 而 只 是 和 计 算 器 有 关 的? 小 菜 : 你 的 意 思 是 分 一 个 类 出 来? 哦, 对 的, 让 计 算 和 显 示 分 开 1.8 业 务 的 封 装 大 鸟 : 准 确 地 说, 就 是 让 业 务 逻 辑 与 界 面 逻 辑 分 开, 让 它 们 之 间 的 耦 合 度 下 降 只 有 分 离 开, 才 可 以 达 到 容 易 维 护 或 扩 展 小 菜 : 让 我 来 试 试 看 Operation 运 算 类 public class Operation public static double GetResult(double numbera, double numberb, string operate) double result = 0d; switch (operate) case "+": result = numbera + numberb; case "-": 6

第 1 章 代 码 无 错 就 是 优? 简 单 工 厂 模 式 result = numbera - numberb; case "*": result = numbera * numberb; case "/": result = numbera / numberb; return result; 客 户 端 代 码 static void Main(string[] args) try Console.Write(" 请 输 入 数 字 A:"); string strnumbera = Console.ReadLine(); Console.Write(" 请 选 择 运 算 符 号 (+ - * /):"); string stroperate = Console.ReadLine(); Console.Write(" 请 输 入 数 字 B:"); string strnumberb = Console.ReadLine(); string strresult = ""; strresult = Convert.ToString(Operation.GetResult(Convert.ToDouble(strNumberA), Convert.ToDouble(strNumberB), stroperate)); Console.WriteLine(" 结 果 是 :" + strresult); Console.ReadLine(); catch (Exception ex) Console.WriteLine(" 您 的 输 入 有 错 :" + ex.message); 小 菜 : 鸟 哥, 我 写 好 了, 你 看 看! 大 鸟 : 孺 鸟 可 教 也, 写 得 不 错, 这 样 就 完 全 把 业 务 和 界 面 分 离 了 小 菜 心 中 暗 骂 : 你 才 是 鸟 呢 口 中 说 道 : 如 果 你 现 在 要 我 写 一 个 Windows 应 用 程 序 的 计 算 器, 我 就 可 以 复 用 这 个 运 算 类 (Operation) 了 大 鸟 : 不 单 是 Windows 程 序,Web 版 程 序 需 要 运 算 可 以 用 它,PDA 手 机 等 需 要 移 动 系 统 的 软 件 需 要 运 算 也 可 以 用 它 呀 7

大 话 设 计 模 式 小 菜 : 哈, 面 向 对 象 不 过 如 此 下 回 写 类 似 代 码 不 怕 了 大 鸟 : 别 急, 仅 此 而 已, 实 在 谈 不 上 完 全 面 向 对 象, 你 只 用 了 面 向 对 象 三 大 特 性 中 的 一 个, 还 有 两 个 没 用 呢? 小 菜 : 面 向 对 象 三 大 特 性 不 就 是 封 装 继 承 和 多 态 吗, 这 里 我 用 到 的 应 该 是 封 装 这 还 不 够 吗? 我 实 在 看 不 出, 这 么 小 的 程 序 如 何 用 到 继 承 至 于 多 态, 其 实 我 一 直 也 不 太 了 解 它 到 底 有 什 么 好 处, 如 何 使 用 它 大 鸟 : 慢 慢 来, 要 学 的 东 西 多 着 呢, 你 好 好 想 想 该 如 何 应 用 面 向 对 象 的 继 承 和 多 态 1.9 紧 耦 合 vs. 松 耦 合 第 二 天 小 菜 问 道 : 你 说 计 算 器 这 样 的 小 程 序 还 可 以 用 到 面 向 对 象 三 大 特 性? 继 承 和 多 态 怎 么 可 能 用 得 上, 我 实 在 不 能 理 解 大 鸟 : 小 菜 很 有 钻 研 精 神 嘛, 好, 今 天 我 让 你 功 力 加 深 一 级 你 先 要 考 虑 一 下, 你 昨 天 写 的 这 个 代 码, 能 否 做 到 很 灵 活 的 可 修 改 和 扩 展 呢? 小 菜 : 我 已 经 把 业 务 和 界 面 分 离 了 呀, 这 不 是 很 灵 活 了 吗? 大 鸟 : 那 我 问 你, 现 在 如 果 我 希 望 增 加 一 个 开 根 (sqrt) 运 算, 你 如 何 改? 小 菜 : 那 只 需 要 改 Operation 类 就 行 了, 在 switch 中 加 一 个 分 支 就 行 了 大 鸟 : 问 题 是 你 要 加 一 个 平 方 根 运 算, 却 需 要 让 加 减 乘 除 的 运 算 都 得 来 参 与 编 译, 如 果 你 一 不 小 心, 把 加 法 运 算 改 成 了 减 法, 这 岂 不 是 大 大 的 糟 糕 打 个 比 方, 如 果 现 在 公 司 要 求 你 为 公 司 的 薪 资 管 理 系 统 做 维 护, 原 来 只 有 技 术 人 员 ( 月 薪 ), 市 场 销 售 人 员 ( 底 薪 + 提 成 ), 经 理 ( 年 薪 + 股 份 ) 三 种 运 算 算 法, 现 在 要 增 加 兼 职 工 作 人 员 ( 时 薪 ) 的 算 法, 但 按 照 你 昨 天 的 程 序 写 法, 公 司 就 必 须 要 把 包 含 原 三 种 算 法 的 运 算 类 给 你, 让 你 修 改, 你 如 果 心 中 小 算 盘 一 打, TMD, 公 司 给 我 的 工 资 这 么 低, 我 真 是 郁 闷, 这 下 有 机 会 了, 于 是 你 除 了 增 加 了 兼 职 算 法 以 外, 在 技 术 人 员 ( 月 薪 ) 算 法 中 写 了 一 句 if ( 员 工 是 小 菜 ) salary = salary * 1.1; 那 就 意 味 着, 你 的 月 薪 每 月 都 会 增 加 10%( 小 心 被 抓 去 坐 牢 ), 本 来 是 让 你 加 一 个 功 能, 却 使 得 原 有 的 运 行 良 好 的 功 能 代 码 产 生 了 变 化, 这 个 风 险 太 大 了 你 明 白 了 吗? 小 菜 : 哦, 你 的 意 思 是, 我 应 该 把 加 减 乘 除 等 运 算 分 离, 修 改 其 中 一 个 不 影 响 另 外 的 几 个, 增 加 运 算 算 法 也 不 影 响 其 他 代 码, 是 这 样 吗? 大 鸟 : 自 己 想 去 吧, 如 何 用 继 承 和 多 态, 你 应 该 有 感 觉 了 小 菜 : OK, 我 马 上 去 写 8

第 1 章 代 码 无 错 就 是 优? 简 单 工 厂 模 式 Operation 运 算 类 public class Operation private double _numbera = 0; private double _numberb = 0; public double NumberA get return _numbera; set _numbera = value; public double NumberB get return _numberb; set _numberb = value; public virtual double GetResult() double result = 0; return result; 加 减 乘 除 类 class OperationAdd : Operation public override double GetResult() double result = 0; result = NumberA + NumberB; return result; class OperationSub : Operation public override double GetResult() double result = 0; result = NumberA - NumberB; return result; 加 法 类, 继 承 运 算 类 减 法 类, 继 承 运 算 类 9

大 话 设 计 模 式 class OperationMul : Operation public override double GetResult() double result = 0; result = NumberA * NumberB; return result; class OperationDiv : Operation public override double GetResult() double result = 0; if (NumberB==0) throw new Exception(" 除 数 不 能 为 0 "); result = NumberA / NumberB; return result; 乘 法 类, 继 承 运 算 类 除 法 类, 继 承 运 算 类 小 菜 : 大 鸟 哥, 我 按 照 你 说 的 方 法 写 出 来 了 一 部 分, 首 先 是 一 个 运 算 类, 它 有 两 个 Number 属 性, 主 要 用 于 计 算 器 的 前 后 数, 然 后 有 一 个 虚 方 法 GetResult(), 用 于 得 到 结 果, 然 后 我 把 加 减 乘 除 都 写 成 了 运 算 类 的 子 类, 继 承 它 后, 重 写 了 GetResult() 方 法, 这 样 如 果 要 修 改 任 何 一 个 算 法, 就 不 需 要 提 供 其 他 算 法 的 代 码 了 但 问 题 来 了, 我 如 何 让 计 算 器 知 道 我 是 希 望 用 哪 一 个 算 法 呢? ( 作 者 注 : 以 上 代 码 读 者 如 果 看 着 吃 力, 说 明 您 对 继 承 多 态 虚 方 法 方 法 重 写 等 概 念 的 理 解 不 够, 建 议 先 阅 读 本 书 附 录 一, 理 解 这 些 基 本 概 念 后 再 继 续 往 下 阅 读 ) 1.10 简 单 工 厂 模 式 大 鸟 : 写 得 很 不 错 嘛, 大 大 超 出 我 的 想 象 了, 你 现 在 的 问 题 其 实 就 是 如 何 去 实 例 化 对 象 的 问 题, 哈, 今 天 心 情 不 错, 再 教 你 一 招 简 单 工 厂 模 式, 也 就 是 说, 到 底 要 实 例 化 谁, 将 来 会 不 会 增 加 实 例 化 的 对 象, 比 如 增 加 开 根 运 算, 这 是 很 容 易 变 化 的 地 方, 应 该 考 虑 用 一 个 单 独 的 类 来 做 这 个 创 造 实 例 的 过 程, 这 就 是 工 厂, 来, 我 们 看 看 这 个 类 如 何 写 简 单 运 算 工 厂 类 public class OperationFactory public static Operation createoperate(string operate) 10

第 1 章 代 码 无 错 就 是 优? 简 单 工 厂 模 式 Operation oper = null; switch (operate) case "+": oper = new OperationAdd(); case "-": oper = new OperationSub(); case "*": oper = new OperationMul(); case "/": oper = new OperationDiv(); return oper; 大 鸟 : 哈, 看 到 了 吧, 这 样 子, 你 只 需 要 输 入 运 算 符 号, 工 厂 就 实 例 化 出 合 适 的 对 象, 通 过 多 态, 返 回 父 类 的 方 式 实 现 了 计 算 器 的 结 果 客 户 端 代 码 Operation oper; oper = OperationFactory.createOperate( + ); oper.numbera = 1; oper.numberb = 2; double result = oper.getresult(); 大 鸟 : 哈, 界 面 的 实 现 就 是 这 样 的 代 码, 不 管 你 是 控 制 台 程 序,Windows 程 序,Web 程 序,PDA 或 手 机 程 序, 都 可 以 用 这 段 代 码 来 实 现 计 算 器 的 功 能, 如 果 有 一 天 我 们 需 要 更 改 加 法 运 算, 我 们 只 需 要 改 哪 里? 小 菜 : 改 OperationAdd 就 可 以 了 大 鸟 : 那 么 我 们 需 要 增 加 各 种 复 杂 运 算, 比 如 平 方 根, 立 方 根, 自 然 对 数, 正 弦 余 弦 等, 如 何 做? 小 菜 : 只 要 增 加 相 应 的 运 算 子 类 就 可 以 了 呀 大 鸟 : 嗯? 够 了 吗? 小 菜 : 对 了, 还 需 要 去 修 改 运 算 类 工 厂, 在 switch 中 增 加 分 支 大 鸟 : 哈, 那 才 对, 那 如 果 要 修 改 界 面 呢? 11

小 菜 : 那 就 去 改 界 面 呀, 关 运 算 什 么 事 呀 大 鸟 : 我 们 来 看 看 这 几 个 类 的 结 构 图 大 话 设 计 模 式 运 算 类 +NumberA : double +NumberB : double +GetResult() : double 简 单 工 厂 类 +createoperate() : 运 算 类 加 法 类 乘 法 类 +GetResult() : double +GetResult() : double 减 法 类 除 法 类 +GetResult() : double +GetResult() : double 1.11 UML 类 图 小 菜 : 对 了, 我 时 常 在 一 些 技 术 书 中 看 到 这 些 类 图 表 示, 简 单 的 还 看 得 懂, 有 些 标 记 我 很 容 易 混 淆 要 不 你 给 我 讲 讲 吧 大 鸟 : 这 个 其 实 多 看 多 用 就 熟 悉 了 我 给 你 举 一 个 例 子, 来 看 这 样 一 幅 图, 其 中 就 包 括 了 UML 类 图 中 的 基 本 图 示 法 UML 类 图 图 示 样 例 12

UML 类 图 图 示 样 例 第 1 章 代 码 无 错 就 是 优? 简 单 工 厂 模 式 氧 气 依 赖 关 系 + 有 生 命 动 物 + 新 陈 代 谢 (in o2 : 氧 气, in water : 水 ) + 繁 殖 () 类 第 一 行 : 类 名 称 第 二 行 : 特 性 ( 字 段 或 属 性 ) 第 三 行 : 操 作 ( 方 法 或 行 为 ) 注 意 : 若 类 名 称 为 斜 体 字, 则 此 类 为 抽 象 类 水 合 成 ( 组 合 ) 关 系 聚 合 关 系 鸟 + 羽 毛 + 有 角 质 喙 没 有 牙 齿 1 2 翅 膀 雁 群 大 雁 鸭 企 鹅 关 联 关 系 + V 形 飞 行 () + 一 形 飞 行 () + 飞 () 气 候 实 现 接 口 继 承 关 系 <<interface>> 飞 翔 + 飞 () 讲 人 话 接 口 矩 形 表 示 法, 顶 端 有 <<interface>> 第 一 行 : 接 口 名 称 第 二 行 : 接 口 方 法 唐 老 鸭 + 讲 话 () 接 口 棒 棒 糖 表 示 法 圆 圈 旁 为 接 口 名 称 接 口 方 法 在 实 现 类 中 出 现 大 鸟 : 首 先 你 看 那 个 动 物 矩 形 框, 它 就 代 表 一 个 类 (Class) 类 图 分 三 层, 第 一 层 显 示 类 的 名 称, 如 果 是 抽 象 类, 则 就 用 斜 体 显 示 第 二 层 是 类 的 特 性, 通 常 就 是 字 段 和 属 性 第 三 层 是 类 的 操 作, 通 常 是 方 法 或 行 为 注 意 前 面 的 符 号, + 表 示 public, - 表 示 private, # 表 示 protected + 有 生 命 动 物 + 新 陈 代 谢 (in o2 : 氧 气, in water : 水 ) + 繁 殖 () 大 鸟 : 然 后 注 意 左 下 角 的 飞 翔, 它 表 示 一 个 接 口 图, 与 类 图 的 区 别 主 要 是 顶 端 有 <<interface>> 显 示 第 一 行 是 接 口 名 称, 第 二 行 是 接 口 方 法 接 口 还 有 另 一 种 表 示 方 法, 俗 称 棒 棒 糖 表 示 法, 就 是 唐 老 鸭 类 实 现 了 讲 人 话 的 接 口 小 菜 : 为 什 么 要 是 讲 人 话? 大 鸟 : 鸭 子 本 来 也 有 语 言, 只 不 过 只 有 唐 老 鸭 是 能 讲 人 话 的 鸭 子 小 菜 : 有 道 理 13

大 话 设 计 模 式 <<interface>> 飞 翔 + 飞 () 讲 人 话 接 口 矩 形 表 示 法, 顶 端 有 <<interface>> 第 一 行 : 接 口 名 称 第 二 行 : 接 口 方 法 唐 老 鸭 + 讲 话 () 接 口 棒 棒 糖 表 示 法 圆 圈 旁 为 接 口 名 称 接 口 方 法 在 实 现 类 中 出 现 interface IFly void Fly(); interface ILanguage void Speak (); 大 鸟 : 接 下 来 就 可 讲 类 与 类, 类 与 接 口 之 间 的 关 系 了 你 可 首 先 注 意 动 物 鸟 鸭 唐 老 鸭 之 间 关 系 符 号 小 菜 : 明 白 了, 它 们 都 是 继 承 的 关 系, 继 承 关 系 用 空 心 三 角 形 + 实 线 来 表 示 + 有 生 命 动 物 + 新 陈 代 谢 (in o2 : 氧 气, in water : 水 ) + 繁 殖 () 鸟 + 羽 毛 + 有 角 质 喙 没 有 牙 齿 大 鸟 : 我 举 的 几 种 鸟 中, 大 雁 是 最 能 飞 的, 我 让 它 实 现 了 飞 翔 接 口 实 现 接 口 用 空 心 三 角 形 + 虚 线 来 表 示 大 雁 + 飞 () <<interface>> 飞 翔 + 飞 () 实 现 接 口 class Bird : Animal class WideGoose : IFly 14

继 承 动 物 类 第 1 章 代 码 无 错 就 是 优? 简 单 工 厂 模 式 实 现 飞 翔 接 口 大 鸟 : 你 看 企 鹅 和 气 候 两 个 类, 企 鹅 是 很 特 别 的 鸟, 会 游 不 会 飞 更 重 要 的 是, 它 与 气 候 有 很 大 的 关 联 我 们 不 去 讨 论 为 什 么 北 极 没 有 企 鹅, 为 什 么 它 们 要 每 年 长 途 跋 涉 总 之, 企 鹅 需 要 知 道 气 候 的 变 化, 需 要 了 解 气 候 规 律 当 一 个 类 知 道 另 一 个 类 时, 可 以 用 关 联 (association) 关 联 关 系 用 实 线 箭 头 来 表 示 企 鹅 关 联 关 系 气 候 class Penguin : Bird private Climate climate; 在 企 鹅 Penguin 中, 引 用 到 气 候 Climate 对 象 大 鸟 : 我 们 再 来 看 大 雁 与 雁 群 这 两 个 类, 大 雁 是 群 居 动 物, 每 只 大 雁 都 是 属 于 一 个 雁 群, 一 个 雁 群 可 以 有 多 只 大 雁 所 以 它 们 之 间 就 满 足 聚 合 (Aggregation) 关 系 聚 合 表 示 一 种 弱 的 拥 有 关 系, 体 现 的 是 A 对 象 可 以 包 含 B 对 象, 但 B 对 象 不 是 A 对 象 的 一 部 分 [DPE](DPE 表 示 此 句 摘 自 设 计 模 式 ( 第 2 版 ), 详 细 摘 要 说 明 见 附 录 二 ) 聚 合 关 系 用 空 心 的 菱 形 + 实 线 箭 头 来 表 示 聚 合 关 系 雁 群 大 雁 + V 形 飞 行 () + 一 形 飞 行 () + 飞 () class WideGooseAggregate private WideGoose[] arraywidegoose; 在 雁 群 WideGooseAggregate 类 中, 有 大 雁 数 组 对 象 arraywidegoose 大 鸟 : 合 成 (Composition, 也 有 翻 译 成 组 合 的 ) 是 一 种 强 的 拥 有 关 系, 体 现 了 严 格 的 部 分 和 整 体 的 关 系, 部 分 和 整 体 的 生 命 周 期 一 样 [DPE] 在 这 里 鸟 和 其 翅 膀 就 是 合 成 ( 组 合 ) 关 系, 因 为 它 们 是 部 分 和 整 体 的 关 系, 并 且 翅 膀 和 鸟 的 生 命 周 期 是 相 同 的 合 成 关 系 用 实 心 的 菱 形 + 实 线 箭 头 来 表 示 另 外, 你 会 注 意 到 合 成 关 系 的 连 线 两 端 还 有 一 个 数 字 1 和 数 字 2, 这 被 称 为 基 数 表 明 这 一 端 的 类 可 以 有 几 个 实 例, 很 显 然, 一 个 鸟 应 该 有 两 只 翅 膀 如 果 一 个 类 可 能 有 无 数 个 实 例, 则 就 用 n 来 表 示 关 联 关 系 聚 合 关 系 也 可 以 有 基 数 的 15

大 话 设 计 模 式 合 成 ( 组 合 ) 关 系 鸟 + 羽 毛 + 有 角 质 喙 没 有 牙 齿 1 2 翅 膀 class Bird private Wing wing; public Bird() wing = new Wing(); 在 鸟 Bird 类 中, 初 始 化 时, 实 例 化 翅 膀 Wing, 它 们 之 间 同 时 生 成 大 鸟 : 动 物 几 大 特 征, 比 如 有 新 陈 代 谢, 能 繁 殖 而 动 物 要 有 生 命 力, 需 要 氧 气 水 以 及 食 物 等 也 就 是 说, 动 物 依 赖 于 氧 气 和 水 他 们 之 间 是 依 赖 关 系 (Dependency), 用 虚 线 箭 头 来 表 示 氧 气 动 物 依 赖 关 系 + 有 生 命 + 新 陈 代 谢 (in o2 : 氧 气, in water : 水 ) + 繁 殖 () 水 abstract class Animal public Metabolism (Oxygen oxygen,water water) 小 菜 : 啊, 看 来 UML 类 图 也 不 算 难 呀 回 想 那 天 我 面 试 题 写 的 代 码, 我 终 于 明 白 我 为 什 么 写 得 不 成 功 了, 原 来 一 个 小 小 的 计 算 器 也 可 以 写 出 这 么 精 彩 的 代 码, 谢 谢 大 鸟 大 鸟 : 吼 吼, 记 住 哦, 编 程 是 一 门 技 术, 更 加 是 一 门 艺 术, 不 能 只 满 足 于 写 完 代 码 运 行 结 果 正 确 就 完 事, 时 常 考 虑 如 何 让 代 码 更 加 简 练, 更 加 容 易 维 护, 容 易 扩 展 和 复 用, 只 有 这 样 才 可 以 真 正 得 到 提 16

第 1 章 代 码 无 错 就 是 优? 简 单 工 厂 模 式 高 写 出 优 雅 的 代 码 真 的 是 一 种 很 爽 的 事 情 UML 类 图 也 不 是 一 学 就 会 的, 需 要 有 一 个 慢 慢 熟 练 的 过 程 所 谓 学 无 止 境, 其 实 这 才 是 理 解 面 向 对 象 的 开 始 呢 17