设计模式
代理:Proxy 所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采
取行动。 在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理
对象可以在客户端和目标对象之间起到中介的作用。
42
软件复用与组件开发
案例:法院的代理
43
软件复用与组件开发
代理模式
代理模式的结构
44
软件复用与组件开发
就会执行一个操作。 Request是使一个对象执行一个操作的仅有方式,操作也是改变对象内部数据仅
有的方式。正是由于这些约束,对象的内部数据被封装了,它们不能直接被访 问。 设计过程中对象来源于分析模型
13
软件复用与组件开发
面向对象基本概念
定义对象的接口
➢ 接口是一个或多个操作特征标记以及零个或多个属性集合的定义
38
软件复用与组件开发
保安系统—采用外观模式之前
39
软件复用与组件开发
保安系统—采用外观模式之后
40
软件复用与组件开发
讨论
对于数据库访问的操作,是否可以采用Facade模式,封装一个大的接 口,暴露给客户端更简单的调用方法?
如果可以的话,这个接口应该包含那些方法呢?
41
软件复用与组件开发
代理模式
的抽象进行统一。 ➢ 晦涩性:很难阅读、理解。没有很好地表现出意图。
9
软件复用与组件开发
为什么使用设计模式
① 尽力用一种标准的方式描述设计经验 ② 为设计者提供一种通用的语言 ③ 增加复用性,减少设计的多样性 ④ 增强设计变更的灵活性 ⑤ 提高设计文档的质量 ⑥ 增强设计的可理解性
10
软件复用与组件开发
④ 保护代理:控制对一个对象的访问权限。
47
软件复用与组件开发
代理模式
实例:智能引用代理的例子
➢ 一个动态网站提供美国上市企业的股票买卖信息。 ➢ 本网站,用户做的事情基本就是搜索和查询。 ➢ 本网站收费:
行为型模式
➢ 观察者模式、策略模式、访问者模式
3
软件复用与组件开发
背景
目前企业级分布式软件开发普遍采用面向对象的方法,OOD直接导致 了设计模式的发展。
开发面向对象的软件是困难的,而开发可复用的面向对象的软件更难。 有经验的设计者使用重用过去的方案。 采用设计模式使设计和代码具有良好的可维护性、可复用性和可升级
1 适配器模式
适配器:Adapter 适配器模式把一个类的接口变换成客户端所期待的另一种接口。 适配器模式使原本无法在一起工作的两个类能够在一起工作。 适配器模式分类:
➢ 类模式 ➢ 对象模式
26
软件复用与组件开发
适配器模式
实例:电压器适配 当把美国的电器拿回中国大陆去用的时候,就面临电压不同的问题。美国
配置。这样的系统应当有一个对象来管理一个属性文件。 很多软件都有数据库,一般而言,整个软件应当使用一个联接通道,而不
是任意在需要时就新打开一个联接通道。
17
软件复用与组件开发
单例模式
单例类的特征
① 单态类只可有一个实例。 ② 它必须自己创立自己这唯一的一个实例。 ③ 它必须给所有其它的类提供自己这一实例。
的生活用电压是110伏,而中国的电压是220伏。 如果要在中国大陆使用在美国使用的电器,就必须有一个能把220伏电压转
换成110伏电压的变压器。
27
软件复用与组件开发
适配器模式
适配器模式—类形式
28
软件复用与组件开发
适配器模式
类形式涉及的成员:
➢ 目标(Target):这就是我们所期 待得到的接口。注意,由于这里讨 论的是类适配器模式,因此目标不 可以是类。
➢ 脆弱性:对系统的改动会导致系统中和改动的地方在概念上无关的许多地方出 现问题。
➢ 牢固性:很难解开系统的纠结,使之成为一些可在其他系统中重用的组件。
8
软件复用与组件开发
为什么使用设计模式
➢ 粘滞性:做正确的事情比做错误的事情要困难。 ➢ 不必要的复杂性:设计中包含有不具任何直接好处的基础结构。 ➢ 不必要的重复性:设计中包含有重复的结构,而该重复的结构本可以使用单一
抽象主题角色:声明了真 实主题和代理主题的共同 接口,这样在任何可用真 实主题的地方都可以使用 代理主题
代理主题角色:代理主题角色内部含 有对真实主题的引用,从而可以在任 何时候操作真实主题对象,代理角色 通常在将客户端调用传递给真实的主 题之前或之后,都要执行某个操作
45
真实主题角色: 定义了代理角色 所代表的真实对 象
37
软件复用与组件开发
外观模式
应用场景:
➢ 为一个复杂子系统提供一个简单接口 ➢ 子系统的独立性
✓引用Facade模式将一个子系统和它的客户端以及其他的子系统分离,可以提 供子系统的独立性和可移植性
➢ 层次化结构 ✓如果层与层之间相互依赖,可限定他们只通过Facade进行通信,从而简化了 层与层之间的依赖关系。
软件复用与组件开发
代理模式
代理模式的顺序图
46
软件复用与组件开发
代理模式
代理模式的分类:
① 远程代理:为一个位于不同的地址空间的对象提供一个局部代表 对象。
② 虚拟代理:根据需要创建一个资源消耗较大的对象,使得此对象 只在需要时才会被真正创建。
③ 智能引用代理:当一个对象被引用时提供一些额外的操作,比如 将对此对象调用的次数记录下来
软件复用与组件开发
如何描述模式
目的:简要描述模式的目的。 使用场合:典型的应用场合 结构:采用UML语言中的类图(或对象图)进行描述。 模式检验:可执行的Java程序代码。 分析:进一步的分析,以及与其他模式的比较 例程
12
软件复用与组件开发
六、面向对象基本概念
发现正确的Objects 面向对象程序由对象组成的,一个对象包装了数据 和操作数据的过程。过程一般称作方法或操作。 当一个对象从客户(client)接收到一个请求(request)或消息(message)时
➢ 源(Adaptee):现有需要适配的 接口。
➢ 适配器(Adapter):适配器类是 本模式的核心。适配器把源接口转 换成目标接口。显然,这一角色不 可以是接口,而必须是实类。
29
软件复用与组件开发
适配器模式ຫໍສະໝຸດ 应用场合:① 你需要使用现有的类,而此类的接口不符合你的需要 ② 你想要建立一个可以重复使用的类,用以与一些彼此之间没有太
分类:23种设计模式:
➢ 创建型:5种 ➢ 结构型:7种 ➢ 行为型:11种
7
软件复用与组件开发
为什么使用设计模式
当软件开发需求的变化而变化时,软件设计会出现坏味道,当软件中 出现下面任何一种气味时,表明软件正在腐化。
➢ 僵化性:很难对系统进行改动,因为每个改动都会迫使许多对系统其他部分的 其它改动。
15
软件复用与组件开发
本章内容
设计模式概述 创建型模式
➢ 工厂方法、单例模式
结构型模式
➢ 适配器模式、外观模式、代理模式
行为型模式
➢ 观察者模式、策略模式、访问者模式
16
软件复用与组件开发
单例模式
一个单例类只可有一个实例。这样的类常用来进行资源管理。 譬如,大多数的软件都有一个(甚至多个)属性(properties)文件存放系统
类型(Type)
➢ 接口和抽象类是实现类的类型 ➢ 接口和抽象类是抽象类型 ➢ 一个对象可能具有多种类型,多个对象也可能共享一个类型
14
软件复用与组件开发
面向对象基本概念
① 接口是面向对象系统的基础 ② 接口和实现分离 ③ 多态:静态绑定和动态绑定 ④ 通过类定义对象的实现 ⑤ 抽象类-部分实现 ⑥ 区分对象的类和类型 ⑦ 要针对接口编程,不要针对实现
性。
4
软件复用与组件开发
背景
“Design patterns help you learn from others‘successes instead of your own failures.”by Mark Johnson 。
5
软件复用与组件开发
什么是设计模式
1970s ,Christopher Alexander的建筑师提出设计模式概念。 直到1987,一些设计模式的论文和文章出现了。 1995年,GOF 发表了书:《设计模式-可复用面向对象软件的基础》
大关联的一些类,包括一些可能在将来引进的类一起工作。这些 源类不一定有很复杂的接口。 ③ (对实例形式的适配器模式而言)你需要改变多个已有的子类的 接口,如果使用类形式的适配器模式,就要针对每一个子类做一 个适配器类,而这不太实际。
30
软件复用与组件开发
适配器模式
Java类库中适配器的使用
➢ 库程序包java\awt\event ✓–WindowAdapter–KeyAdapter ✓–MouseAdapter ✓–MouseMotionAdapter ✓–WindowAdapter ✓......
行为型模式
➢ 观察者模式、策略模式、访问者模式
24
软件复用与组件开发
结构型模式概述
结构型模式涉及到如何组合类和对象以获得更大的结构。
➢ 结构型类模式:采用继承机制来组合接口或实现。 ➢ 结构型对象模式:不是对接口和实现进行组合,而是描述如何对一些对象进行
组合,从而实现新功能的一些方法。
25
软件复用与组件开发
单例模式
系统设计
22
软件复用与组件开发
单例模式
单例模式和多例模式
➢ 多例类可以有多个实例。 ➢ 多例模式可按有无上限来划分,也可以按有无状态来划分。
思考:
➢ 连接池或对象池中的模式?
23
软件复用与组件开发