资源描述
目 录 1 OO概述4 常用设计模式3 OO六大原则2 面向接口编程 1 OO概述 面 向 对 象 分 析 (OOA)做 什 么 ?从 问 题 域 中 获 取 需 要 的 类 和 对 象 , 以 及 它 们 之 间 的 关 系 。 面 向 对 象 设 计 (OOD)怎 么 做 ? 面 向 对 象 编 程 (OOP)Do it 1 OO概述老 张 开 车 去 东 北 。请 用 OO思 想 进 行 分 析 (OOA)和 设 计 (OOD),体 现 OO三 大 特 性封 装 类 (名 词 ): 1 OO概述老 张 开 车 去 东 北 。请 用 OO思 想 进 行 分 析 (OOA)和 设 计 (OOD)。封 装 类 (名 词 ): 1 OO概述老 张 开 车 去 东 北 。封 装创 建 成 员 方 法 。 1 OO概述老 张 开 车 去 东 北 。获 取 属 性 , 完 善 成 员 方 法 。 1 OO概述老 张 开 车 去 东 北 。封 装 :作 用 ?隐 藏 信 息 , 降 低 类 间 耦 合 性 。 1 OO概述老 张 开 车 去 东 北 。初 始 设 计 1 OO概述public class Driver private String driverName;public String getName() return driverName;public void drive(Car car) car.go(new Address(东 北 ); 1 OO概述public class Carpublic void go(Address dest) System.out.println(一 路 哼 着 歌 , 冒 着 烟 , 去 了 + dest.getName(); 1 OO概述public class Address private String addressName;public String getName() return addressName ;public void setName(String name) addressName = name; 1 OO概述老 张 开 车 去 东 北 。设 计 优 化 : 继 承 和 多 态在 某 个 粒 度 视 图 层 面 上 对 同 类 事 物 不 加 区 别 的 对 待 而 统 一 处 理 1 OO概述public class Driver private String driverName;public String getName() return driverName;public void setName(String name) driverName = name;/Vihecle vihecle = new Car(); public void drive(Vihecle vihecle) vihecle.go(new Address(东 北 ); 1 OO概述public abstract class Vihecle public abstract void go(Address dest);public class Car extends Viheclepublic void go(Address dest) System.out.println(一 路 哼 着 歌 , 冒 着 烟 , 去 了 + dest.getName();public class Plane extends Vihecle public void go(Address dest) System.out.println(“一 路 驾 着 云 彩 去 了 + dest.getName(); 1 OO概述public class Address private String addressName;public Address(String name) addressName = name;public String getName() return addressName ;public void setName(String name) addressName = name; 1 OO概述public class Clientpublic static void main(String args) Driver d = new Driver();d.setName(老 张 ); /d.drive(new Plane();d.drive(new Car();有 什 么 缺 陷 ? 1 OO概述持 续 优 化 : 添 加 而 不 修 改 , 系 统 扩 展 性 强 !重 载 2 面向接口编程 面 试 题 :1.抽 象 类 可 以 有 构 造 方 法 ,接 口 不 可 以 .2.抽 象 类 中 可 以 有 普 通 成 员 变 量 ,普 通 方 法 .接 口 不 可 以 .3.抽 象 类 中 的 抽 象 方 法 的 访 问 类 型 不 能 是 private访 问 类 型 ,但 接口 的 抽 象 方 法 只 能 是 public.4.抽 象 类 可 以 包 含 静 态 方 法 ,但 接 口 不 可 以 .5. 抽 象 类 中 静 态 成 员 变 量 的 访 问 类 型 可 以 任 意 .但 接 口 只 能 是Public(static)final类 型 .6.一 个 类 可 以 实 现 多 个 接 口 ,但 只 能 继 承 一 个 抽 象 类 .1 abstract class和 interface有 什 么 区 别 ? 2 面向接口编程设 计 层 面 :抽 象 类 是 某 种 抽 象 事 物 (is a)。接 口 是 一 组 行 为 规 范 (like a)。接 口 体 现 了 “ 如 果 你 是 则 必 须 能 ”的 理 念语 法 层 面 :抽 象 类 体 现 单 继 承 关 系 ;接 口 可 实 现 多 继 承 。 2 面向接口编程 2 面向接口编程 面 试 题 ( 扩 展 题 ) :2.1 接 口 是 否 可 以 继 承 接 口 ? 2.2 接 口 是 否 可 以 继 承 抽 象 类 ?2.3 抽 象 类 是 否 可 以 实 现 接 口 ? 2.4 抽 象 类 是 否 可 以 继 承 具 体 类 ? 2.5 抽 象 类 中 是 否 可 以 有 静 态 的 main方 法 ? 抽 象 类 与 普 通 类 的 唯 一 区 别 就 是 不 能 创 建 实 例 对 象 和 允 许 有abstrct方 法 ! 2 面向接口编程面 向 接 口 编 程 :在 系 统 分 析 和 架 构 中 , 分 清 层 次 和 依 赖 关 系 , 下 层 不 是 直 接 向其 上 层 提 供 服 务 : 即 不 是 直 接 实 例 化 在 上 层 中 , 而 是 通 过 定 义一 组 接 口 , 仅 向 上 层 暴 露 其 接 口 功 能 , 上 层 对 于 下 层 仅 仅 是 接口 依 赖 , 而 不 依 赖 具 体 类 。 系 统 层 次 间 协 作 关 系 是 系 统 设 计 的 关 键 , 小 到 不 同 类 之 间 的 通信 , 大 到 各 模 块 之 间 的 交 互 。 本 质 : 面 向 抽 象 编 程 , 定 义 与 实 现 的 分 离 。 2.1.1 设计模式四人帮GoF( “ 四 人 帮 ” , 又 称 Gang of Four, 即 Erich Gamma, Richard Helm, Ralph Johnson abstract void Close(); 3.2 接口隔离原则(ISP)新 需 求 :需 要 门 具 有 报 警 功 能 。解 决 方 案 一 : 在 抽 象 类 (或 接 口 )Door添 加 alarm方 法 。abstract Doorabstract void Open();abstract void Close();abstract void Alarm(); 3.2 接口隔离原则(ISP)问 题 ?违 背 ISP(接 口 隔 离 原 则 ), Alarm方 法 对 于 依 赖 Door的 模 块 是多 余 的 。修 改 方 案 :1) abstact Door保 留 Open()、 Close(),Alarm由 子 类 扩 展 。2) 拆 分 成 interface Door和 interface Alarm接 口 。3) 拆 分 成 abstact Door和 interface Alarm。 3.2 接口隔离原则(ISP)abstract Doorabstract void Open();abstract void Close();Interface Alarmablevoid Alarm();class AlarmDoor extends Door implents Alarmable 3.3 里氏替换原则(LSP)里 氏 替 换 原 则 (Liskov Substitution Principle)定 义 : 所 有 引 用 基 类 的 地 方 必 须 能 透 明 地 使 用 其 子 类 的 对 象 。 通 俗 言 之 : 任 何 父 类 出 现 的 地 方 , 子 类 一 定 可 以 出 现 。在 程 序 中 尽 量 使 用 基 类 类 型 来 对 对 象 进 行 定 义 , 而 在 运 行 时 再确 定 其 子 类 类 型 , 用 子 类 对 象 来 替 换 父 类 对 象 。总 结 : 子 类 可 以 扩 展 父 类 的 功 能 , 但 不 能 改 变 父 类 原 有 的 功 能 3.4 依赖倒置原则(DIP)依 赖 倒 置 原 则 (Dependence Inversion Principle )定 义 :1、 高 层 模 块 不 应 该 依 赖 低 层 模 块 , 两 者 都 应 该 依 赖 于 抽 象 ( 抽象 类 或 接 口 ) 。2、 抽 象 ( 抽 象 类 或 接 口 ) 不 应 该 依 赖 于 细 节 ( 具 体 实 现 类 ) 。3、 细 节 ( 具 体 实 现 类 ) 应 该 依 赖 抽 象 。通 俗 言 之 : 依 赖 抽 象 , 不 依 赖 实 现 。总 结 : 面 向 接 口 编 程 3.5 开闭原则(OCP)开 闭 原 则 (Open Close Principle)定 义 :一 个 软 件 实 体 如 类 、 模 块 和 函 数 , 应 该 对 扩 展 开 放 , 对 修 改 关闭 。通 俗 言 之 : 一 个 好 的 系 统 是 在 不 修 改 已 有 源 代 码 的 情 况 下 ,可 以扩 展功 能 。实 现 开 闭 原 则 的 关 键 就 是 抽 象 化 。 3.5 开闭原则(OCP)在 开 -闭 原 则 中 ,不 允 许 修 改 的 是 抽 象 的 类 或 者 接 口 ,允 许 扩 展 的是 具 体 的 实 现 类 ,抽 象 类 和 接 口 在 开 -闭 原 则 中 扮 演 着 极 其 重 要的 角 色 。模 板 方 法 模 式 和 观 察 者 模 式 都 是 开 闭 原 则 的 极 好 体 现 。 3.6 合成复用原则(CRP)合 成 复 用 原 则 (Composite ReusePrinciple , CARP): 要 优 先使 用 对 象 组 合 ( 聚 合 )通 俗 言 之 : 要 尽 量 使 用 合 成 /聚 合 , 尽 量 不 要 使 用 继 承 。继 承 复 用 :从 基 类 继 承 而 来 的 实 现 是 静 态 的 , 不 可 能 在 运 行 时 发 生 改 变 ,没 有 足 够 的 灵 活 性 ;破 坏 封 装 性 , 把 父 类 实 现 细 节 直 接 暴 露 给 子 类 ( 白 箱 复 用 ) ;父 类 发 生 改 变 , 子 类 也 应 改 变 , 类 与 类 之 间 高 耦 合 。 3.6 合成复用原则(CRP)组 合 /聚 合 复 用 : 耦 合 度 相 对 较 低 , 可 以 在 运 行 时 动 态 进 行 。黑 箱 复 用 !如 果 两 个 类 之 间 是 “ Has-A”的 关 系 应 使 用 组 合 或 聚 合 , 如 果 是“ Is-A”关 系 可 使 用 继 承 。桥 接 模 式 遵 循 该 原 则 ! 3.6 合成复用原则(CRP) 3.6 合成复用原则(CRP) 3.7 迪米特原则(LOD)迪 米 特 原 则 (Law Of Demeter)定 义 :指 一 个 对 象 应 该 对 于 其 他 对 象 有 最 少 的 了 解 。问 题 由 来 : 类 与 类 之 间 的 关 系 越 密 切 , 耦 合 度 越 大 , 当 一 个 类发 生 改 变 时 , 对 另 一 个 类 的 影 响 也 越 大 。通 俗 言 之 : 不 要 跟 陌 生 人 说 话 。 类 应 该 对 自 己 需 要 耦 合 或 调 用的 类 知 道 得 越 少 越 好 。 2.1.2 设计模式概述设 计 模 式 ( Design pattern) 是 一 套 被 反 复 使 用 、 多 数 人 知 晓的 、 经 过 分 类 编 目 的 、 代 码 设 计 经 验 的 总 结 。 为 何 提 倡 设 计 模 式 ?根 本 原 因 是 为 了 代 码 复 用 , 增 加 可 维 护 性 。设 计 模 式 有 助 于 对 框 架 结 构 的 理 解 , 成 熟 的 框 架 通 常 使 用 了 多种 设 计 模 式 。设 计 模 式 通 过 实 现 面 向 对 象 六 大 原 则 , 从 而 达 到 了 代 码 复 用 、增 加 可 维 护 性 的 目 的 。 2.2.1 设计模式基本元素 模 式 名 称 问 题 解 决 方 案 效 果 2.2.2 设计模式分类 设 计 模 式 分 为 三 种 类 型 , 共 23类 。 创 建 型 模 式 : 单 例 模 式 、 抽 象 工 厂 模 式 、 建 造 者 模 式 、 工 厂 模式 、 原 型 模 式 。 结 构 型 模 式 : 适 配 器 模 式 、 桥 接 模 式 、 装 饰 模 式 、 组 合 模 式 、外 观 模 式 、 享 元 模 式 、 代 理 模 式 。 行 为 型 模 式 : 模 版 方 法 模 式 、 命 令 模 式 、 迭 代 器 模 式 、 观 察 者模 式 、 中 介 者 模 式 、 备 忘 录 模 式 、 解 释 器 模 式 、 状 态 模 式 、 策略 模 式 、 职 责 链 模 式 、 访 问 者 模 式 。 2.3.1设计模式之单例模式(Singleton)单 例 设 计 模 式 的 特 点 :1.单 例 设 计 模 式 保 证 一 个 类 只 有 一 个 实 例 ;2.要 提 供 一 个 访 问 该 类 对 象 实 例 的 全 局 访 问 点 。单 例 模 式 最 重 要 的 就 是 要 保 证 一 个 类 只 有 一 个 实 例 并 且 这 个 类易 于 被 访 问 。一 个 全 局 类 使 得 一 个 对 象 可 以 被 访 问 , 但 是 这 样 做 却 不 能 防 止你 实 例 化 多 个 对 象 。 2.3.1 设计模式之单例模式(Singleton)单 例 设 计 模 式 的 实 现 :1.为 了 避 免 其 它 程 序 过 多 的 建 立 该 类 的 对 象 , 先 禁 止 其 它 程 序 建立 该 类 对 象 实 例 ( 将 构 造 器 私 有 化 ) 。2.为 了 方 便 其 它 程 序 访 问 该 类 的 对 象 , 只 好 在 本 类 中 自 定 义 一 个对 象 , 由 1可 知 该 对 象 是 static的 , 并 对 外 提 供 访 问 方 式 。 2.3.1 设计模式之单例模式(Singleton)单 例 模 式 具 体 实 现 有 两 种 :懒 汉 式 class Singleton private static Singleton instance=null; private Singleton() public static Singleton getInstance() if(instance=null) instance=new Singleton(); return instance; 2.3.1 设计模式之单例模式(Singleton)饿 汉 式 class Singleton private static Singleton instance=new Singleton(); private Singleton() public static Singleton getInstance() return instance; 2.3.1 设计模式之单例模式(Singleton)饿 汉 式 (总 结 ) 对 象 预 先 加 载 , 线 程 是 安 全 的 , 在 类 创 建 好 的 同 时 对 象 生 成 ,调 用 获 得 对 象 实 例 的 方 法 反 应 速 度 快 , 代 码 简 练 。懒 汉 式 (总 结 ) 对 象 延 迟 加 载 , 效 率 高 , 只 有 在 使 用 的 时 候 才 实 例 化 对 象 , 若设 计 不 当 线 程 会 不 安 全 , 代 码 相 对 于 饿 汉 式 复 杂 , 第 一 次 加载 类 对 象 的 时 候 反 应 不 快 。 2.3.1 设计模式之多例模式(Multiton Pattern)class Multiton private static Multiton multi1=new Multiton(); private static Multiton multi2=new Multiton(); private Singleton() public static Singleton getInstance(int value) if(1=value)return multi1;elsereturn multi2; /多 例 模 式 : 单 例 模 式 的 推 广 。 2.3.1 设计模式之多例模式(Multiton Pattern)class Multiton private static List list = new ArraryList(); private static Multiton multi1=new Multiton(); private static Multiton multi2=new Multiton(); private static final int maxCount = 2;/最 多 的 实 例 数 static list.add(multi1); list.add(multi2); private Singleton() public static Singleton getInstance(int value) return list.get(index); /多 例 模 式 : 单 例 模 式 的 推 广 。 2.3.2 工厂模式(Factory)工 厂 模 式 在 java与 模 式 中 分 为 三 类 :简 单 工 厂 模 式 (静 态 工 厂 Simple Factory)工 厂 方 法 模 式 (Factory Method)抽 象 工 厂 模 式 (Abstract Factory)GOF在 设 计 模 式 一 书 中 , 将 简 单 工 厂 模 式 看 做 特 殊 的 工 厂方法 模 式 。 2.3.2 工厂模式(Factory)简 单 工 厂 模 式 (静 态 工 厂 Simple Factory)Creater(工 厂 角 色 ):是 简 单 工 厂 的 核 心 。 工 厂 角 色 可 被 外 部 直 接调 用 , 创 建 所 需 产 品 对 象 。Product(抽 象 产 品 角 色 ): 具 体 产 品 类 的 父 类 。ConcreteProduct(具 体 产 品 类 )。 2.3.2 工厂模式(Factory)public class Creater /静 态 工 厂 模 式public static Dog CreateDog(String dogName)throws Exceptionif(carName.equalsIgnoreCase(“TaiDi)return new TaiDi();else if(carName.equalsIgnoreCase(“MuYang)return new MuYang(); public abstract Dogpublic void run(); 2.3.2 工厂模式(Factory) public Taidi extends Dogpublic MuYang extends Dog 2.3.2 工厂模式(Factory)public class Clientpublic static void main(String args)/Dog dog= new TaiDi();/Dog dog = new MuYang();Dog dog = Creater.CreateDog(“TaiDi); 2.3.2 工厂模式(Factory)静 态 工 厂 在 创 建 产 品 时 , 通 常 结 合 反 射 一 起 使 用 。public class Creater /静 态 工 厂 模 式public static TaiDi CreateDog(String carName)throws Exception TaiDi taidiDog = (TaiDi) Class.forName(“zhong.xxx + carName).newInstance();return taidiDog ;问 题 简 单 工 厂 为 什 么 要 用 静 态 方 法 实 现 ?静 态 方 法 的 继 承 问 题 ? 缺 点 : 对 于 新 产 品 的 加 入 创 建 , 无 能 为 力 ! 违 背 开 闭 原 则 ! 2.3.2 工厂模式(Factory)工 厂 方 法 模 式 (Factory Method)简 单 工 厂 模 式 对 增 加 新 产 品 , 无 能 为 力 , 不 符 合 开 闭 原 则 (对 扩展 开 发 , 对 修 改 封 闭 )。 工 厂 方 法 模 式 是 对 简 单 工 厂 模 式 的 抽 象 2.3.2 工厂模式(Factory)public abstract class Factory Dog getInstance(); public class TaiDiFactory implements Factory public Dog getInstance() return new TaiDi (); public class MuYangFactory implements Factory public Dog getInstance() return new MuYang (); Creater ConcreteCreaterConcreteCreater 2.3.2 工厂模式(Factory)public abstract class Dogpublic abstract void run();public class TaiDi extends Dogpublic class MuYang extends Dogpublic void run() public void doAfraid()System.out.println(“我 是 MuYang我 怕 谁 ! ”); ProductConcreteProductConcreteProduct 2.3.2 工厂模式(Factory)public static void main(String args) Factory factory = new TaiDiFatory(); Dog dog = factory. getInstance(); dog . run(); /dog.doAfraid(); 哪 些 情 况 使 用 工 厂 模 式 ?1) 当 客 户 程 序 不 需 要 知 道 要 使 用 对 象 的 创 建 过 程 。 2) 客 户 程 序 使 用 的 对 象 存 在 变 动 的 可 能 , 或 者 根 本 就 不 知 道 使 用 哪 一 个 具 体 的 对 象 。 2.3.3 抽象工厂模式(Abstract Factory)提 供 一 个 创 建 一 系 列 相 关 或 相 互 依 赖 对 象 的 接 口 , 而 无 需 指 定它 们 具 体 的 类 。 2.3.3 抽象工厂模式(Abstract Factory)1.AbstractFactory 声 明 一 个 创 建 抽 象 产 品 对 象 的 操 作 接 口 。2.ConcreteFactory 实 现 创 建 具 体 产 品 对 象 的 操 作 。 3.AbstractProduct 为 一 类 产 品 对 象 声 明 一 个 接 口 。 4.ConcreteProduct 定 义 一 个 将 被 相 应 的 具 体 工 厂 创 建 的 产 品 对象,实 现 AbstractProduct接 口 。 5.Client 仅 使 用 由 AbstractFactory和 AbstractProduct类 声 明 的接 口 2.3.3 抽象工厂模式(Abstract Factory)AbstractFactory:public interface AbstractFactory public Car CreateBmwCar();public Car CreateBenzCar(); 2.3.3 抽象工厂模式(Abstract Factory)ConcreteFactory:class ConcreteSportFactory implents AbstractFactory public Car CreateSportBmwCar()return new BmwSportsCar();public ISporting CreateSportBenzCar()return new BenzSportsCar(); 2.3.3 抽象工厂模式(Abstract Factory)AbstractProduct:public abstract Car void go(); 2.3.3 抽象工厂模式(Abstract Factory)ConcretePorduct:public class BmwSportsCar extend Car public void go() System.out.println( BmwSportsCar run!); public class BenzSportsCar extend Car public void go() System.out.println( BenzSportsCar run!); 2.3.3 抽象工厂模式(Abstract Factory)Client:public static void main(String args) AbstractFactory sportCarFactory = new ConcreteSportFactory (); Car car = sportCarFactory . CreateSportBmwCar(); /Car car = sportCarFactory . CreateSportBenzCar(); 能 不 能 把 增 加 产 品 家 族 数 量 ? 2.3.4 外观模式(Facade)Facade模 式 2.3.4 外观模式(Facade)Facade模 式 :1 定 义 了 一 个 更 高 的 接 口 , 使 子 系 统 更 加 容 易 使 用 ;2 为 子 系 统 中 的 一 组 接 口 提 供 一 个 统 一 的 接 口 。 2.3.4 外观模式(Facade)Eg:开 关 电 脑 模 拟 程 序 (见 开 关 电 脑 模 拟 程 序 文 档 ) 2.3.4 外观模式(Facade)核 心 思 想 : 封 装 交 互 , 简 化 调 用 (化 繁 为 简 )!作 用 :外 部 减 少 与 子 系 统 内 多 个 模 块 的 交 互 , 松 散 耦 合 ;让 外 部 能 够 更 简 单 的 使 用 子 系 统 ;大 大 节 省 学 习 时 间 。 2.3.5 适配器模式(Adapter)Adapter模 式 ( 结 构 型 )1 将 一 个 类 的 接 口 转 换 成 客 户 希 望 的 另 外 一 个 接 口 ;2 使 得 原 本 由 于 接 口 不 兼 容 而 不 能 一 起 工 作 的 那 些 类 可 以 一 起工 作 。 Eg1 :电 源 适 配 器 2.3.5 适配器模式(Adapter)Eg2:android email显 示一 个 ListView的 使 用 涉 及 了 两 个 部分 , 一 个 是 数 据 源 DataSource,另 外 一 个 是 数 据 源 的 各 项 的 布 局显 示 ItemLayout。 DataSource是 不能 直 接 展 示 在 用 户 面 前 , ItemLayout才 是 直 接 用 户 , DataSource向ItemLayout填 充 和 转 换 就 是 一 个 典型 的 适 配 过 程 , 就 需 要 一 个 适 配 器 对 象 来 参 与 其 中 。 2.3.5 适配器模式(Adapter)示 例 程 序 (见 Adapter-获 取 电 压 程 序 ) 2.3.5 适配器模式(Adapter)Adapter模 式 ( 结 构 型 )它 不 是 为 了 解 决 还 处 在 开 发 阶 段 的 问 题 , 而 是 解 决 正 在 服 役 的项 目 问 题 。解 决 接 口 不 相 容 的 问 题 : 复 用 代 码 , 不 修 改 原 有 代 码 。缺 点 :对 于 对 象 适 配 器 来 说 , 更 换 适 配 器 的 实 现 过 程 比 较 复 杂 。对 象 适 配 器 和 类 适 配 器 ? 2.3.6 职责链模式(COR)职 责 链 (Chain of Responsibility):行 为 型发 送 方 发 送 一 个 请 求 , 使 多 个 对 象 都 有 机 会 处 理 请 求 , 从 而 避免 请 求 的 发 送 者 和 接 收 者 之 间 的 耦 合 关 系 。将 这 些 对 象 连 成 一 条 链 , 并 沿 着 这 条 链 传 递 该 请 求 , 直 到 有 一个 对 象 处 理 它 为 止 。 核 心 思 想 : 给 多 个 对 象 处 理 一 个 请 求 的 机 会 , 从 而 解 耦 发 送 者和 接 受 者 。 2.3.6 职责链模式(COR)适 用 范 围1 有 多 个 对 象 可 以 处 理 同 一 个 请 求2 不 能 明 确 指 定 接 收 者 2.3.6 职责链模式(COR)Eg1:公 司 请 假Eg2:brew平 台 消 息 机 制Eg3:java 异 常 处 理 try catch(Exception e1) catch(Exception e2) finally 2.3.6 职责链模式(COR) 2.3.7 观察者模式(Observer)观 察 者 模 式 :定 义 对 象 间 的 一 种 一 对 多 的 依 赖 关 系 ,当 一 个 对 象 的 状 态 发 生 改变 时 , 所 有 依 赖 于 它 的 对 象 都 得 到 通 知 并 被 自 动 更 新 。 观 察 者 中 涉 及 了 两 个 对 象 , 一 个 是 观 察 目 标 , 一 个 是 观 察 者 。观 察 目 标 有 典 型 的 3个 方 法 : 订 阅 , 取 消 订 阅 , 通 知 。订 阅 : 增 加 状 态 或 事 件 通 知 的 对 象取 消 订 阅 : 删 除 状 态 或 事 件 通 知 对 象通 知 : 通 知 所 有 订 阅 了 状 态 和 事 件 的 对 象 。 2.3.7 观察者模式(Observer)Eg:杂 志 订 阅 , 杂 志 是 主 题 , 观 察 者 是 订 阅 者 。 当 出 版 新 杂 志 时候 , 这 个 事 件 会 自 动 通 知 所 有 的 订 阅 者 。Eg:猫 和 老 鼠 2.3.7 观察者模式(Observer)观 察 者 模 式 :定 义 对 象 间 的 一 种 一 对 多 的 依 赖 关 系 ,当 一 个 对 象 的 状 态 发 生 改变 时 , 所 有 依 赖 于 它 的 对 象 都 得 到 通 知 并 被 自 动 更 新 。 观 察 者 中 涉 及 了 两 个 对 象 , 一 个 是 观 察 目 标 , 一 个 是 观 察 者 。观 察 目 标 有 典 型 的 3个 方 法 : 订 阅 , 取 消 订 阅 , 通 知 。订 阅 : 增 加 状 态 或 事 件 通 知 的 对 象取 消 订 阅 : 删 除 状 态 或 事 件 通 知 对 象通 知 : 通 知 所 有 订 阅 了 状 态 和 事 件 的 对 象 。 2.3.8 中介者模式(Mediator)中 介 者 模 式 :1 用 一 个 中 介 对 象 来 封 装 一 系 列 的 对 象 交 互 ;2 中 介 者 使 各 对 象 不 需 要 显 式 地 相 互 引 用 , 从 而 使 其 耦 合 松 散 ,而 且 可 以 独 立 地 改 变 它 们 之 间 的 交 互 。 Eg:android-Activity与 IntentDemo程 序 : Mediator模 式 -居 委 会 大 妈 2.3.8 中介者模式(Mediator) 2.3.8 中介者模式(Mediator) 2.3.8 中介者模式(Mediator)中 介 者 模 式 本 质 : 封 装 交 互 何 时 选 用 中 介 者 模 式 1 如 果 一 组 对 象 之 间 的 通 信 方 式 比 较 复 杂 , 导 致 相 互 依 赖 、 结 构混 乱 ;2 如 果 一 个 对 象 引 用 很 多 的 对 象 , 并 直 接 跟 这 些 对 象 交 互 , 导致 难 以 复 用 该 对 象 。 2.3.9 模式区别外 观 模 式 和 中 介 者 模 式1 中 介 者 模 式 主 要 用 来 封 装 多 个 对 象 之 间 相 互 的 交 互 , 多 用 在 系统 内 部 的 多 个 模 块 之 间 ; 而 外 观 模 式 封 装 的 是 单 向 的 交 互 。2 在 中 介 者 模 式 的 实 现 里 面 , 是 需 要 实 现 具 体 的 交 互 功 能 的 ; 而外 观 模 式 的 实 现 里 面 , 一 般 是 组 合 调 用 或 是 转 调 内 部 实 现 的 功能 , 通 常 外 观 模 式 本 身 并 不 实 现 这 些 功 能 。 2.3.9 模式区别外 观 模 式 和 单 例 模 式通 常 一 个 子 系 统 只 需 要 一 个 外 观 实 例 , 所 以 外 观 模 式 可 以 和 单例 模 式 组 合 使 用 , 把 Facade类 实 现 成 为 单 例 。 2.3.9 模式区别外 观 模 式 和 抽 象 工 厂 模 式外 观 模 式 的 外 观 类 通 常 需 要 和 系 统 内 部 的 多 个 模 块 交 互 , 每 个模 块 一 般 都 有 自 己 的 接 口 , 所 以 在 外 观 类 的 具 体 实 现 里 面 , 需要 获 取 这 些 接 口 , 然 后 组 合 这 些 接 口 来 完 成 客 户 端 的 功 能 。 那 么 怎 么 获 取 这 些 接 口 呢 ? 就 可 以 和 抽 象 工 厂 一 起 使 用 , 外 观类 通 过 抽 象 工 厂 来 获 取 所 需 要 的 接 口 , 而 抽 象 工 厂 也 可 以 把 模块 内 部 的 实 现 对 Facade进 行 屏 蔽 , 也 就 是 说 Facade也 仅 仅 只 是知 道 它 从 模 块 中 获 取 的 它 需 要 的 功 能 , 模 块 内 部 的 细 节 Facade也 不 知 道 了 。 2.3.10 状态模式状 态 模 式 允 许 一 个 对 象 在 其 内 部 状 态 改 变 的 时 候 改 变 其 行 为 。这 个 对 象 看 上 去 就 像 是 改 变 了 它 的 类 一 样 。状 态 模 式 把 所 研 究 的 对 象 的 行 为 包 装 在 不 同 的 状 态 对 象 里 , 每一 个 状 态 对 象 都 属 于 一 个 抽 象 状 态 类 的 一 个 子 类 。 状 态 模 式 的意 图 是 让 一 个 对 象 在 其 内 部 状 态 改 变 的 时 候 , 其 行 为 也 随 之 改变 。 2.3.10 状态模式天 气 案 例 ( 疯 狂 设 计 模 式 ) Context Weather SunShine Rain 2.3.11 桥接模式桥 接 模 式 :将 抽 象 部 分 与 它 的 实 现 部 分 分 离 , 使 它 们 都 可 以 独 立 地 变 化 。应 用 场 景 :某 个 类 具 有 两 个 或 两 个 以 上 的 维 度 变 化 , 如 果 只 是 使 用 继 承 将无 法 实 现 这 种 需 要 , 或 者 使 得 设 计 变 得 相 当 臃 肿 。 2.3.11 桥接模式 2.3.11 桥接模式举 例 来 说 :面 馆 供 应 牛 肉 面 、 猪 肉 面 , 而 且 顾 客 可 根 据 自 己 的 口 味 选择是 否 添 加 辣 椒 。 此 时 就 产 生 了 一 个 问 题 , 我 们 如 何 来 应 对 这 种变 化 : 我 们 是 否 需 要 定 义 辣 椒 牛 肉 面 、 无 辣 牛 肉 面 、 辣 椒 猪 肉面 、 无 辣 猪 肉 面 4个 子 类 ? 如 果 餐 厅 还 供 应 羊 肉 面 、 韭 菜 面 呢? 如 果 添 加 辣 椒 时 可 选 择 无 辣 、 微 辣 、 中 辣 、 重 辣 风 味 呢?那 程 序 岂 非 一 直 忙 于 定 义 子 类 ? 腾 讯 笔 试 题 ( ) 设 计 模 式 将 抽 象 部 分 与 它 的 实 现 部 分 相 分 离 。A、 Singleton( 单 例 ) B、 Bridge( 桥 接 ) C、 Composite( 组 合 ) D、 Facade( 外 观 ) 2.3.12 原型模式 2.3.9 原型模式(Prototype )原 型 模 式 (创 建 类 模 式 ) : 核 心 是 : Prototype类 , 此 类 满 足 需 满 足 两 个 条 件 : 1) 实 现 Cloneable接 口 ;2) 重 写 Object类 中 的 clone方 法 pubilc interface Cloneable 2.3.9 原型模式(Prototype )原 型 模 式 (创 建 类 模 式 ) : 优 势 :1) 创 建 对 象 性 能 优 于 new一 个 对 象 ;2) 简 化 对 象 的 创 建 ;问 题 :直 接 在 内 存 中 复 制 数 据 , 因 此 不 会 调 用 到 类 的 构 造 方 法 。不 但 构 造 方 法 中 的 代 码 不 会 执 行 , 甚 至 连 访 问 权 限 都 对 原 型 模 式 无 效 。 应 用 场 景 : 在 需 要 重 复 地 创 建 相 似 对 象 时 可 以 考 虑 使 用 原 型 模 式 Eg:复 制 、 粘 贴 2.3.12 原型模式Person p = new Person(23, zhang); Person p1 = p; System.out.println(p); System.out.println(p1); 问 题 :堆 内 存 ?栈 内 存 ?静 态 区 ?代 码 区 ?String s = abc String s = new String(“abc”); ? 2.3.12 原型模式Person p = new Person(23, zhang); Person p1 = (Person) p.clone(); System.out.println(p); System.out.println(p1); 2.3.12 原型模式 总 结 :当 克 隆 的 对 象 只 有 基 本 类 型 ,不 含 引 用 类 型 时 ,可 以 用 浅 克 隆 实 现 ;当 克 隆 的 对 象 含 有 引 用 类 型 时 ,必 须 使 用 深 克 隆 实 现 。 2.3.13 装饰者模式File file = new File (hello.txt); FileInputStream in=new FileInputStream(file); BufferedInputStream inBuffered=new BufferedInputStream (in);DataInputStream bis = new DataInputStream( new BufferedInputStream( new FileInputStream(File); ? 2.3.13 装饰者模式装 饰 模 式 以 对 客 户 端 透 明 的 方 式 动 态 地 给 一 个 对 象 附 加 上 更 多 的 责 任 。装 饰 模 式 可 以 在 不 创 造 更 多 子 类 的 情 况 下 , 将 对 象 的 功 能 加 以 扩 展 。 是 继 承 关 系 的 一 种 替 代 方 案 。 2.3.13 建造者模式 2.3.9 MVC架构模式MVC中 的 设 计 模 式 : 观 察 者 、 策 略 、 状 态 、 中 介 者 等 练习题 练习题 练习题 练习题 练习题 练习题 练习题 练习题 练习题下 面 语 句 创 建 了 几 个 对 象 ( )String s1 = Hello World;String s2 = Hello World;String s3 = s1;String s4 = new String(Hello World);String s5 = new String(Hello World);
展开阅读全文