当前位置:首页 > 设计模式
弱关联,可以动态的确定,并且可以在运行期间,动态的改变的关联. 在java语言中,继承是强关联.聚合关系是弱关联
AWT中,每一个Component子类都有一个ComponentPeer子类与之对应.
所有Component子类都属于一个等级结构,所有ComponentPeer子类都属于另外一个登记结构.
Component类型,和ComponentPeer类型,都通过Toolkit对象相互通信.
Component相当于抽象角色.Button相当于修正抽象角色.
ComponentPeer相当于实现化角色,而ButtonPeer相当于具体实现化角色. Java的AWT就是这样实现”Write once,run anywhere”
Toolkit使用了抽象工厂模式创建各种Peer对象.
大多数Driver都是桥梁模式的应用
重构:不增加不减少系统功能的前提下,对代码的结构进行优化
JDBC/ODBC桥不是桥梁模式,是适配器模式
1.16 不变模式
不变模式最著名的应用就是Sring
分为两种,一种是弱不变模式,(这个类的子类的实例具有可能会变化的状态) 一种是强不变模式.(子类的实例也具有不可变的状态)
不变属性和只读属性的区别
如果程序处理的字符串,有频繁的内容变化时候,就不宜使用String类.而应该使用StringBuffer.
如果需要对字符串做大量循环查询,也不宜使用String,而应考虑byte[] 或者char[].
String实际上是一个封装类.因为它封装了一个char数组
private final char value[];
存在vector里面的必须是对象.而不可以是原始类型.
Long根本没有提供修改内部值的方法.
Long的静态方法,parseLong,并没有修改自身的状态,而是返回了一个新的Long对象
享元模式中,大部分享元是不变对象,但享元不一定非得是不变对象不可
1.17 ok策略模式strategy
?
用意: ? ?
针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得他们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化 解释 ? ? ? ? ? ?
用一句话来说就是:准备一组算法,并将每一组算法封装起来,使得他们可以互换。 策略模式相当于可插入的算法
策略模式是对算法的包装. 是把使用算法的责任和算法本身分隔开。委派给不同的对象管理。
策略模式又称政策模式。
客户端决定什么情况下使用什么策略 这个模式涉及到三个角色: ? 环境角色Context
? 抽象策略角色Strategy 可以是接口可以是抽象类 ? 具体策略角色ConcreteStrategy 使用策略模式的例子:
? AWT的LayoutManager,使用了策略模式 在什么情况下使用策略模式
? 多个算法选择其一
? 算法使用的数据不需要用户知道。 在什么情况下不使用策略模式 ? ?
策略模式不适合处理同时嵌套多于一个算法的情形,这时,应该用装饰模式 ? 在所有的折扣算法计算后,总的折扣恕不能超过1000元。
? ?
?
优点
? 策略模式把环境和行为分割开来,环境负责维持和查询行为类,各种算法则在具体
策略类提供,由于算法和环境独立开来,算法的增减、修改都不会影响环境和客户
端。 ? ? ?
由于具体策略角色可以继承抽象策略角色,达到代码重用的目的。 避免环境角色端使用继承关系。
避免使用多重条件转化语句,比使用继承更原始落后
?
缺点
? 客户端必须之道所有的算法是怎么回事 ? 需要想办法控制对象的数量。 举例
? 商场打折
和其他的设计模式的关系 ? ? ? ? ?
策略模式和建造模式的关系 和适配器模式的关系 和享元模式的关系
和模板方法模式的关系 和MVC模式的关系
? ?
? 和装饰模式的关系
1.18 ok模版方法模式
准备一个抽象类,将部分逻辑以具体方法及具体构造方法的形式实现,然后声明一些抽象方法,来迫使子类实现剩余的逻辑,不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模版方法方式的用意 模板方法是基于继承的代码复用的基本技术。 代表具体逻辑步骤的方法称作基本方法。
而将这些基本方法汇总起来的方法叫模板方法。 此模式鼓励恰当的使用继承
HttpServlet类的service方法,典型的模版方法模式
模板方法模式中的基本方法都是留给子类实现的。他们的名字应该以do开始。
1.19 ok观察者模式Observer
又叫发布-订阅模式、模型-视图模式、源-监听器模式、从属者模式
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化的时候,会通知所有观察者对象,使他们自动更新自己.
Java1.1以后,awt事件处理机制,建立在观察者模式基础上的.因此,观察者模式在java语言中的地位较为重要。 有两种实现方式。第二种方式与第一种方式的区别:代表存储观察者对象的聚集连线是从抽象主题到抽象观察者。
第二种方案与java语言给出的对观察者模式的支持完全一致。 java.util.Observer
java.util.Observable
被观察者类都是java.util.Observable的子类 底层事件和语义事件 语义事件:ActionEvent(单击按键,选择菜单项,选择列表项,在文字框中输入文字),AdjustmentEvent(调整滚动条),ItemEvent(用户在一组选择框中选择了一个,或者在列表中选择一项),TextEvent(文字框的内容有变化)
底层事件:ComponentEvent,KeyEvent,MouseEvent,FoucusEvent,WindowEvent,ContainerEvent
1.20 ok迭代子模式
? ? ? ?
迭代子模式又叫游标模式
迭代子模式可以顺序的访问一个容器中的元素而不必暴露容器的内部表象。 JCF中广泛使用迭代子来遍历容器中的元素. 角色
? 抽象迭代子角色
? 具体迭代子角色
?
? 聚集角色
? 具体聚集角色 ? 客户端
宽接口和窄接口 ? ?
宽接口:一个聚集的接口提供了可以用来修改聚集元素的方法 窄接口:一个聚集的接口没有提供可以用来修改聚集元素的方法
?
白箱聚集与外稟迭代子
? 提供宽接口的聚集叫白箱聚集 ? ? ?
由于迭代子是在聚集的结构之外的,因此这样的迭代子又叫外稟迭代子
在这种实现中,迭代子角色是一个外部类。而具体聚集角色向外界提供遍历聚集元素的接口
迭代子模式要求聚集对象必须有一个工厂方法,也就是createIterator方法,向外界提供迭代子对象的实例。
?
黑箱聚集与内稟迭代子
? 一个黑箱聚集不向外部提供遍历自己元素对象的接口。由于内稟迭代子恰好是聚集? ?
的内部类,因此,内稟迭代子对象是可以访问聚集的元素的。
同时保证聚集对象的封装和迭代子功能的实现的方案叫黑箱实现方案。
由于迭代子是在聚集的结构之内定义的,因此这样的迭代子又叫内稟迭代子
?
游标迭代子
? 由于聚集实现自己的迭代逻辑,并向外部提供适当的借口,使得迭代子可以从外部控制聚集元素的迭代过程,这样一来迭代子控制的仅仅是一个游标而已,这种迭代
子游标迭代子。
主动迭代子和被动迭代子
? 使用主动迭代子的客户端会明显调用迭代子的next()等迭代方法。在遍历过程中向?
前进行
而客户端在使用被动迭代子时,客户端并不明显的调用迭代方法,迭代子自动退经
?
?
遍历过程。 内稟与外稟
? 使用外稟迭代子的一个重要理由是它可以被几个不同的方法和对象共同享用和控? ?
制。
使用内稟迭代子的优点是不破坏聚集的封装。
AbstractList使用内稟迭代子,但同时这个类向外提供自己的遍历方法。也就是说客户端可以定义自己的外稟迭代子。
?
静态迭代子和动态迭代子。
? 静态迭代子将原聚集复制了一份。好处是安全简单。易于实现。不容易出错。短处
是对时间和内存的消耗。 ? ?
动态迭代子保持对聚集元素的引用。完整的动态迭代子不容易实现。 简化的动态迭代子。
?
fail-fast
? 当一个算法开始之后,它的运算环境发生变化。使得算法无法进行必要的调整时,这种算法就应当立即发出故障信号。这就是fail-fast的含义。 ? 是一种出项错误时的早期警报功能。 过滤迭代子
?
共分享92篇相关文档