JAVA与模式-BJ
1.OCP开-闭原则,即设计模块时,应该使模块可在不被修改的前提下被扩展.(即不修改源代码的情况下改变模块的行为)
2.里氏代换原则,任何基类出现的地方,子类都可以出现
3.依赖倒转原则,依赖于抽象,不要依赖于实现(一般性/通用性---特例)
4.合成/聚合复用原则CRP,尽量使用合成/聚合,而不是继承关系达到复用目的
?? (在新对象中使用已有的对象,使之成为新对象的一部分,新对象通过委派这些对象达到复用)
5.--具体类不是用来继承的(继承关系形成的等级结构中,树叶结点都应为具体类,树枝结点都应为接口/抽象类)
6.--具体类B继承于具体类A的重构--将A、B的共同点抽象成抽象类/接口C,A、B继承于C
???? (抽象类中应拥有尽可能多的共同方法,应拥有尽可能少的数据)
7.耦合关系:
?? (1)零耦合
?? (2)具体耦合--发生在两个具体类之间,当一具体类直接引用另一具体类时.
?? (3)抽象耦合--发生在具体类和抽象类/接口之间,这种耦合有灵活性
8.静态类型static/明显类型apparent---变量声明时的类型
?? 实际类型actual
9.?抽象类+接口-->适配器 :java语言API中有很多适配模式,命名规范为Abstract+接口名,例AbstractMap等
10.接口隔离原则ISP --?使用多个专门的接口,比使用单一的总的接口要好
11.单例
?(1) 一些资源管理常常设计成单例模式,如系统中的配置文件的管理,设计成单例可使配置文件只加载一次,不必读一次加载一次
?(2)单例对象的条件:1.只有一个实例2.单例类必须自己创建自己的实例3.单例类必须给所有其他对象提供这一实例
?(3)应用:
???? a.单例对象自己引用单例对象本身.
???? b.单例对象作为一个聚集(map),而聚集存储的元素是其他对象
???? c.单例对象作为一个聚集(map),聚焦存储的元素是单例类本身的实例(多例)
12.java.util.Properties和ResourceBundle区别是Properties不支持多语言
----Locale代码=语言代码+地区代码(如:en_US/en_GB),Resource文件命名规范是shortname_Locale代????????????
???? 码.properties
13.建造模式Builder---用于产品的建造需要一步一步实现的情况(或者产品的某属性依赖于其他属性的建造)
角色:
抽象建造角色Builder:通过产品的建造过程所抽象出的产品的具体零件的建造方法(一般建造方法与零件个数相同)
????????????????????????????? 以及一个返回建造后的产品实例的retrieveProduct方法
具体建造角色ConcreteBuilder:包含对应的具体产品的对象,并实现抽象建造角色的建造方法,具体建造角色负责建造其所
???????????????????????????????????????????? 维护的产品及返回建造后的产品实例(具体建造角色可继承自适配器)
?
具体产品角色Product1:具体产品角色可继承某标记接口Product
导演类(Director):包含一个建造角色Builder,以及一个建造方法construct,该方法按照产品的建造顺序一点一点建造产品
客户端----------->创建一个具体产品(零件未被建造),创建一个其对应的产品建造者,将产品交由产品建造者,然后将建造者交
???????????????????????? 给导演者Director,然后调用导演者的建造方法construct来一步一步建造产品.????????
14.原始模型(Prototype)模式:通过给出一个原型对象来指明要创建对象的类型,然后用复制原型对象的办法创建更多同
????????????????????????????????????????????? 同类型的对象.
--JAVA语言的构件模型直接支持原始模型模式,即Object的clone方法,但是被复制的对象必须实现一个标识接口??
? Cloneable,否则编译器会抛出CloneNotSupportedException
--浅复制/深复制
?? 浅复制只复制原型对象,而原型对象中所引用的其他对象不被复制(clone)
?? 深复制把原型对象以及原型对象中引用的其他对象都复制了一遍(注意深复制可有多层,注意循环引用)
--利用串行化实现深复制--先使对象实现Serialization接口,然后把对象的一个copy写到流中,再读出来重建对象
//串行化到字节缓冲区中ByteArrayOutputStream baos = new ByteArrayoutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(protoType);//并行化ByteArrayInputStream bais = new ByteArrayInputStream();ObjectInputStream ois = new ObjectInputStream(bais);Object deepCopyObject = ois.readObject();//注意:要保证原型对象以及其引用的对象都是可串行化的,或者不可串行化的对象为transient的
?? ---串行化=冷冻=把对象写到Byte流里的过程Serialization
?????? 并行化=解冻=把对象从Byte流中读出来Deserialization
15.适配器模式(变压器模式)---对于一些不适用于某接口I的源类/接口,制做出对应的适配器,以适用于接口I
---目标(Target)角色:所期待的接口
---源(adaptee)角色:需要适配的类/接口...
---适配器(adapter):将源类/接口转换成目标接口(即使源类/接口能适用于目标接口)
?
---缺省适配模式(Default Adapter)---该模式用于为某接口提供缺省(空)实现,方便实现者只需要实现感兴趣的方法.
????????????????????????????????????????????????????? 适配器类应为抽象类,因为适配器类的实例没有意义,但适配器的方法都是具体方法
(注意:适配器模式与缺省适配模式的用意稍有不同)
?
?
?
?
?
?
?
?
?
?
?
?