摘要:Command模式只是封装了一个没有任何变量的函数.interface Command{ void Excute();}具有强烈的分解功能的味道.把函数层面的任务提升到了类的层面(一个类仅仅是为了完成一个函数,而且没有该函数外的任何成员).简单的Command事件驱动的系统.Sensor(传感器)....
阅读全文
摘要:继承program by difference.通过继承,可以建立完整的软件结构分层.其中每一层都可以重用该层次以上的Code.过度使用继承的代价是巨大的.应使用组合或者委托来替代继承.Template Method(使用继承)和Strategy(使用委托)模式解决了相同的问题:分离通用的算法和具体...
阅读全文
摘要:类和实例对于大多数的类,都可以创建多个实例.在需要和不需要时,创建和删除这些实例.该过程会伴随着内存的分配和归还.同时,有一些类,应该仅有一个实例.该实例在程序启动/结束时被创建和删除.root对象.通过该对象可以得到系统中的其他对象.factory对象.用来创建系统中的其他对象.manager对象...
阅读全文
摘要:去除代码中的if(obj==null),或者try/catch语句.维持Code的一致性.Null对象,代表"什么也不做"的一个对象.使Null对象称为一个匿名内部类确保了该类只有单一实例.并且客户无法创建Null对象的其他实例.可以使用if(obj== Employee.Null)表达.[Agil...
阅读全文
摘要:使用new的Code都违反了DIP.但是,依赖于稳定的具体类,是无害的.例如string.另一方面,对于正在开发中的APP,很多具体类是易变的.此时应该依赖于抽象接口.Factory模式:只依赖于抽象接口就能创建出具体对象的实例.对Test Fixture使用工厂编写UT时,希望把一个模块和它使用的...
阅读全文
摘要:[Agile Software Development(Principles,Patterns,and Pracitices)]
阅读全文
摘要:拉模式.Observer实现了一种间接关系.可以向各种对象注册观察者.可以有效地管理依赖关系.拉模式实现简单,且Subject和Observer可以成为类库中的可重用元素.当被观察对象比较复杂,并且Observer需要一个提示,那么使用推模式.该模式的目的:增加新的Observer对象时,无需更改被...
阅读全文
摘要:简易的台灯Abstract Server模式谁拥有接口.接口属于它的客户,而不是它的派生类.接口和客户之间的逻辑关系,强于接口和其派生类的逻辑关系.逻辑关系和实体关系的强度是不一致的.在实体关系上,继承比依赖更强.最好将接口和它的客户打包,而不是和它的派生类在一起.Adapter模式当Light不能...
阅读全文
摘要:软件中的Barrier.数据从程序移到DB中时,要跨越数据库的Barrier.消息从一个PC到另一个PC时,要跨越网络Barrier.跨越可能是复杂的,很可能处理Barrier的Code会多于处理本来要解决的问题的Code.Proxy模式.DB和ProductIMP这两个协作对象互相不可见.Prox...
阅读全文
摘要:Modem结构Visitor模式对于被访问(Modem)层次结构中的每一个派生类,访问者(Visitor)层次中都有一个对应的方法.从派生类到方法的90度旋转.新增类似的Windows配置函数时,Visitor模式使用Visitor派生类来代替了被访问者结构中的方法.双重分发:accept()+vi...
阅读全文
摘要:地铁十字转门状态迁移表格.起始状态 触发迁移的事件 终止状态 要执行的动作.Locked Coin UnLocked UnLockUnLocked Pass LockedLock最直接的方式:switch(state) case Locked : switch(event) case Pass:St...
阅读全文
摘要:Transaction Script使用过程来组织业务逻辑,每个过程处理来自表现层的单个请求.运行机制尽可能将其放置于与表现层和数据源层隔离的类中.为了便于修改和测试,不能调用任何表现层逻辑.组织成类一个类,围绕一个主题将相关事务脚本组织在一起.Command模式.一个事务脚本对应一个类.优点:允许...
阅读全文
摘要:Table Data Gateway充当数据库表访问入口的对象.一个实例处理一个表中所有的行.在应用逻辑中混杂SQL语句会引起问题.表数据入口包含了用于访问单个表或者视图的所有SQL.其他代码调用它的方法来实现所有与数据库的交互.运行机制其用于数据读写,因此是无状态的.每个方法都将输入参数映射为SQ...
阅读全文
摘要:维护受业务事务影响的对象列表,并协调变化的写入和并发问题的解决.从DB中存取Data时,必须记录增删改动作,以将对DB有影响的数据写会到DB中去.如果在每次修改对象模型时就对DB进行相应的修改,会造成大量小规模的DB调用,降低了速度.工作单元记录业务事务中对DB有影响的所有变化.然后在操作结束后,了...
阅读全文
摘要:通过在Map中保存每个已加载过的对象,确保每个对象只加载一次.当要访问对象时,首先检查标识映射,看需要的对象是否已经存在其中.使用Identify来确保不重复加载相同的数据,不仅有助于保证正确性(不会将同一数据加载到两个不同的对象上),还能提升性能.运行机制基本思想:使用一系列映射.这些映射包含了从...
阅读全文
摘要:一个对象,它虽然不包含所需要的所有数据,但是它知道怎么获取这些数据设计专门的对象来把数据从DB中加载到内存中.该对象可以完成在加载所需对象的同时,把与之相关的对象也一并加载了.否则,必须显示加载所有所需的对象.但是,加载一个对象可能会引起大量相关对象的加载.当真正需要的对象只有几个时,会损害系统的性...
阅读全文
摘要:在对象中保存DB的ID字段,以维持内存对象和DB数据Row之间的identify.关系DB使用key来区分数据行.而内存对象不需要这样的键.因为对象系统能够保证身份确认.读取时没有问题,但是为了正确地写回DB.需要联系两者.本质上,只是将DB表的主键存储在对象的field上.工作机制键的选择mean...
阅读全文
摘要:把对象间的关系映射到DB表键的外键引用对象之间可以通过对象引用来互相直接访问.运行机制关键是标识域.一对一的关联.使用一个DB的外键取代.一对多的对象集合.不能在DB中把相连的对象集合都保存了.必须颠倒引用的方向一张唱片有多个曲目,那么在曲目表中保存唱片的外键.更新时较为麻烦插入和删除在多的一方(曲...
阅读全文
摘要:把关联保存为一个表,存储关联表的外键在对象中,使用集合作为域值,来处理多值域.而在DB中,只能有单值域.外键映射的核心,是在关联关系的单值端使用外键来维持联系.而在多对多的关联关系中,已经不存在单值端了.运行机制使用一个链接表来保存关联关系.仅有两个字段,即两个关联表的外键ID.对于每一对相关联的对...
阅读全文
摘要:让一个类为其子类(泛意上的)执行DB映射一些对象肯定会出现在另一对象的上下文中.此时,使用另一对象的Mapper来执行第一个对象的映射,来简化映射过程.运行机制在DB持久化时,依赖者类依赖于所有者类.每个依赖者只能有一个所有者.活动记录和行数据入口依赖者类的映射代码都写在所有者中.数据映射器没有依赖...
阅读全文
摘要:Embedded Value把一个对象映射成另一个对象表中的若干字段.OO系统中会有很多小对象(DataRange,Money).而作为表在DB中毫无意义.默认想法是把一个对象保存为一个表.但是,将这些小对象,映射为该对象所有者记录中的若干字段.运行机制可以看做一种特殊的依赖映射.该值对象是一个依赖...
阅读全文
摘要:使用将若干相似的类映射为单表,对拥有许多特殊数据的类使用具体表继承.对高层次使用类表继承,对低层次使用具体表继承.Single Table Inheritance在DB中将类继承层次设计为一个单表,表中各列代表不同类中的所有域.运行机制每个类负责把与之相关的数据保存在表的一行中.表中其它不相关的列留...
阅读全文
摘要:MetaData Mapping元数据映射在MetaData中保存object-relation映射的详细信息.以表格形式定义映射,并可由通用代码来处理映射.运行机制MetaData中的信息如何以运行时Code的形式表现.Code Generation程序:输入是MetaData,输出是映射实现类的...
阅读全文
摘要:Remote Facade远程外观在OO模型中,存在很多规模小,且有小方法的对象.这些小对象会导致很多的对象间交互.在单一地址空间里,小对象没问题.但是,当在两个进程间做调用时,频繁的跨进程交互会造成性能开销.远程外观,减少远程调用的次数.建立在大量的细粒度对象之上,提供一个粗粒度的外观.不包括任何...
阅读全文
摘要:每次只允许一个业务事务来访问数据,以防止并发业务事务中的冲突.离线并发处理通常会出现多个业务事务操作同一数据.最简单的办法是为整个业务事务保持一个系统事务.但是事务系统不适合于处理长事务.首选乐观离线锁.而悲观离线锁,作为它的补充.从一开始就避免冲突.它要求业务事务在对数据进行操作前就必须获取该数据...
阅读全文
摘要:用一个锁Lock一组相关的对象有时,需要按组来修改多个对象.这样,在需要锁住其中一个的时候,必须连带地将其他的对象都上锁.为每一个对象都加上一个锁是很繁琐的.粗粒度锁是覆盖多个对象的单个锁.简化了加锁行为.且不必为了给它们加锁而加载所有对象.运行机制为一组对象建立一个控制点.使用乐观离线锁让组中每个...
阅读全文
摘要:Client Session State 客户会话状态.在Client端保存会话状态.运行机制Client在每次请求时会把所有的会话数据传给Server,Server在响应时把所有的会话状态传给Client.可以是完全无状态的Server.通常使用可序列化的DTO对象来传递数据.在HTML中,可选的...
阅读全文
摘要:在两个独立的对象之间建立通信的对象需要在两个必须相互隔离的子系统间建立通信.可能是因为无法修改已有的子系统,或者不愿意在两者之间建立依赖关系.甚至不愿意这两个子系统与另一个部件间建立依赖关系.运行机制控制着子系统键的通信细节.但是并不被子系统感知.难点是如何激活映射器进行(在子系统间的)数据交换.因...
阅读全文
摘要:Layer Supertype层超类型某一类型充当一层中所有类型的超类型.(DomainObject).运行机制当软件某一层中所有对象有公共特征时,可以将这些特征提取到一个超类上去.Separated Interface分离接口在一个包中定义接口,而在另一个与之分离的保重实现该接口.为了减少系统部件...
阅读全文
摘要:架构架构的定义最高层次的系统分解.系统中不易改变的决定.主观上的,对系统的组成部分和各部分件交互关系的设计的可共享的理解.层次如何分层,以及层间如何协作.企业应用虽然部分模式适合于所有软件,但是大多数模式仅适合于某些特定领域和分支.特征持久化数据.程序多次运行都需要这些数据.数据的生命周期可能比软件...
阅读全文
摘要:Agility,指以微小增量的方式构建软件.全局视图和软件一起演化.每次迭代中,都使设计尽可能适合于当前系统,而不会花时间去预测未来的需求,更不会试图构建一些基础结构去支撑未来才需要的特性.更关注的是当前的系统.不进行预先设计,不需要成熟的初始设计.而保持设计尽可能的干净,简单.并使用单元测试和验收...
阅读全文
摘要:一个类应仅有一个引起它变化的原因.内聚性.每个Responsibility都是变化的一个轴线.当需求变化时,该变化会反映为类的职责的变化当一个类耦合了多个职责时,一个职责的变化会消弱或抑制其他职责的能力.这种耦合导致了fragile的设计.职责.A reson for change.一个类负担的N个...
阅读全文
摘要:对于僵化性的臭味,应用OCP原则之后,再进行同样的改动时,只需添加新代码,而不必改动已正常运行的代码.扩展模块行为的方式通常是修改模块的Code,不允许修改的模块常常被认为是具有固定的行为.Open:模块的行为是可以扩展的,即可以改变模块的功能.Close:对模块进行扩展时,不必改动DLL,Code...
阅读全文
摘要:OCP中,继承支持了抽象和多态特性.LSP:子类必须能够替换掉其基类.反例:使用if/else判断类型,以便选择针对特定类型的正确行为.有效性并非本质属性模型的有效性,只能通过它的客户程序来表现.在考虑一个特定设计是否合理时,必须要根据该设计的使用者所作出的合理假设来审视它.这些合理的假设常常就是单...
阅读全文
摘要:高层模块不应该依赖于底层模块,二者都应该依赖于抽象;细节应依赖于抽象.传统习惯中,高层模块依赖于底层模块,策略依赖于细节的结构.这是要定义子程序层次结构,该层次结构描述了高层模块如何调用底层模块.但是,这也就意味着,底层模块的更改会直接影响到高层模块.而APP的区别就是体现在这些高层模块中的.包含高...
阅读全文
摘要:ISP用来处理fat接口的缺点.如果类的接口不是内聚的,那么该类就具有fat接口.fat接口可以分解为多个组.每个组服务于不同的客户.ISP承认不需要内聚接口的对象.但是建议客户不应该看到它作为单一的类而存在.客户程序看到的应该是多个具有内聚接口的抽象基类.接口污染.分离客户就是分离接口.客户对接口...
阅读全文
摘要:包的设计.通过把类组织成package,可以在更高层次的抽象上理解设计.通过包来管理软件的开发和发布.由于类之间的相互依赖关系,包之间会产生依赖关系.包的依赖关系展示了APP的高层组织结构.粒度:内聚性."自顶向上"的将类划分到包中Reuse-Release Equivalence Priciple...
阅读全文
摘要:静态视图对应用领域中的概念以及与系统实现有关的内部概念进行建模. 在OOP中,使用Class(广义的)来完成这些任务,所以,类和类的关系组成了静态视图.其亦称为类图. 核心:捕捉对象的结构.关联(asscociation):描述对象之间的链(关系).同一类的不同对象之间可以有关联,称为自反关联.多重...
阅读全文
摘要:获取当前焦点所在的控件..Net本身没有该API.必须使用Win32 API解决.internal static extern IntPtr GetFocus();Control focusedControl = Control.FromHandle(GetFocus());判断控件是否含有焦点.F...
阅读全文
摘要:1,初始化控件一般在onCreate()中完成,由于构造器中尚未完成控件加载,不能在其内初始化控件.2,Activity子类必须含有无参构造.Intent.startActivity()方法调用的是Activity的无参构造来启动Activity的.3,intent-filterMain Activ...
阅读全文
摘要:1,SharedPreferenceskey-value对.将xml格式的文件,写入到ROM私有目录中.data/data//shared-prefs目录下.可以直接putXxx来存取简单类型,对于复杂类型,需要Base64编码.文件的访问权限Linux中的文件,扩展名不重要,依据文件属性来决定文件...
阅读全文