- 博客(47)
- 资源 (10)
- 收藏
- 关注
原创 代理模式(Proxy Pattern)(三):HeadFirst使用java API创建一个保护代理
一、问题描述使用java动态代理根据访问权限控制对客户信息的修改以保护客户信息,客户的信息包括:姓名name、性别gender、interests兴趣爱好、评分HotOrNot(类似于顶或踩),这些信息可以被所有用户看到,只有顾客可以修改自己的name、gender、interests,但是不能修改自己的评分,只能由其他人给他打分。即根据权限控制外界修改客户信息的行为以保护客户信息
2013-05-28 23:11:54
1807
1
原创 代理模式(Proxy Pattern)(四):HeadFirst中CD封面虚拟代理
一、问题描述当我们在网络上加载一些图像时,限于连接宽带和网络负载,下载可能需要一些时间,所以在等待图像加载的时候,就应该显示一些东西。我们也不希望在等待图像时,整个应用程序被挂起。一旦图像加载完成,刚才显示的东西就应该消失,图像显示出来。二、类图三、实现代码1.ImageComponentclass ImageCo
2013-05-28 23:10:52
1546
原创 代理模式(Proxy Pattern)(二):Java API中的动态代理
一、Java动态代理 相对于静态代理的代理类在编译时生成(.class文件),动态代理与其的区别是:动态代理类在运行时在JVM中生成。Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类(实现了InvocationHandler接口)对象,便能动态地获得代理类,避免了静态代理中代理类的急剧膨胀问题。代理类会负责将所有的方
2013-05-22 16:41:14
4628
原创 代理模式(Proxy Pattern)(一):代理模式介绍
一、意图为其他对象提供一种代理以控制对这个对象的访问。二、适用性使用代理模式的常见的重要情况有:1) 远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。比如:你可以将一个在世界某个角落一台机器通过代理假象成你局域网中的一部分。2) 虚拟(Virtual)代理:根据需要将一个资源消耗很大或者比较复杂的对象
2013-05-20 22:35:15
2036
原创 组合模式(Composite Pattern)(二):HeadFirst中使用组合设计菜单
一、问题描述使用组合模式为餐厅设计菜单,使服务员Waitress可以很方便地使用菜单。二、类图三、代码实现1.(Component角色)MenuComponentpublic abstract class MenuComponent{ //对一些方法进行了默认实现 public void add(M
2013-05-20 22:31:41
1930
原创 组合模式(Composite Pattern)(一):组合模式介绍
一、意图将对象组合成树形结构以表示“部分-整体”的层次结构。Composite模式使得用户对单个对象和组合对象的使用具有一致性。二、适用性• 你想表示对象的部分-整体层次结构。• 你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。三、组成——抽象构件角色(Component):为组合中的对象
2013-05-20 22:30:49
7258
2
原创 命令模式(Command Pattern)(一):命令模式介绍
一、意图 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。二、适用性(1)系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。(2)在不同的时刻指定、排列和执行请求。(3)支持修改日志、撤销操作。(4)系统需要将一组操作组合在一起
2013-05-18 23:16:24
6104
原创 命令模式(Command Pattern)(二):HeadFirst中的遥控器
一、问题描述使用命令模式实现遥控器,遥控器上的不同按钮控制电灯的开关及亮度、天花板风扇的开关及转速等,支持撤销。具体按钮:开灯/关灯按钮、暗光开/关按钮、风扇高速/中速/低速/关按钮、撤销按钮。遥控器如下图所示:遥控器担当请求者(或称为调用者)的角色,用RemoteControlWithUndo类实现,其内有Command[]类型的属性onCommands和offCom
2013-05-18 23:15:52
2790
原创 适配器模式(Adapter Pattern)(二):HeadFirst中的火鸡冒充鸭子
一、问题描述火鸡通过模仿鸭子走路的姿势、叫的声音以及飞行就可以将自己伪装成一只鸭子,当我们缺少鸭子对象时,就可以使用一些火鸡对象来冒充鸭子对象,但是我们还必须编写一个接口,使一只火鸡可以通过这个接口(即适配器)装换成一只鸭子。我们可以写一个对象适配器或类适配器将火鸡适配成鸭子。二、类图三、代码实现1.Duck,
2013-05-18 23:15:06
2226
原创 适配器模式(Adapter Pattern)(一):适配器模式介绍
一、意图将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。二、适用性对象需要利用现存的并且接口不兼容的类。需要创建可重用的类以协调其他接口可能不兼容的类。三、组成——目标角色(Target):定义Client客户要使用的特定领域的接口。—
2013-05-18 23:14:26
3083
1
原创 模板方法模式(TemplateMethod Pattern)(三):HeadFirst中的咖啡和茶的冲泡
以《HeadFirst设计模式》中的咖啡和茶的冲泡过程的实现为例讲述模板方法模式的应用场景。一、问题描述星巴兹咖师傅的训练手册: 咖啡冲泡法: (1)把水煮沸 (2)用沸水冲泡咖啡 (3)把咖啡倒进杯子 (4)加糖和牛奶 茶冲泡法: (1)把水煮沸 (2)用水浸泡茶叶 (3)把茶倒进杯子 (4)加柠檬二、逐步
2013-05-11 09:45:01
2558
1
原创 模板方法模式(TemplateMethod Pattern)(二):java中模板方法和钩子的使用示例
一、java API中的模板方法的使用1.Arrays.sort()排序在对数组进行排序时,我们常会使用Arrays.sort()方法,Arrays类的sort()方法就是模板方法。模板方法模式的重点在于提供一个算法,并让子类实现某些步骤,但是在Arrays.sort()数组排序时并不是如此,通常我们无法设计一个类继承java数组,而sort()方法希望能够适用
2013-05-11 09:43:44
3906
原创 模板方法模式(TemplateMethod Pattern)(一):模板方法模式介绍
一、意图 定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。二、适用性1.一次性实现一个算法的不变部分,并且将可变的行为留给子类来完成。2.各子类的公共行为应该被提取出来并集中到一个公共父类中以避免代码的重复。首先识别现有代码的不同之处,并且把不同的部分分离为新的操作,最后,用一个这些新的操
2013-05-11 09:42:19
1203
原创 策略模式(Strategy Pattern)(二):HeadFirst中鸭子的实现
一、问题描述joe上班的公司做了一套成功的模拟鸭子的游戏:SimUDuck,游戏中会出现各种鸭子,一边游泳,一边呱呱叫,由于公司竞争压力加剧,必须重新设计鸭子(Duck)类,要求是:便于产生新的鸭子对象,可为鸭子添加新的行为,易于维护,动态设置行为。二、类图说明:1.对各种鸭子的解释: RedHeadDuck:红头鸭,可以用翅膀飞,
2013-05-11 09:40:48
5776
原创 策略模式(Strategy Pattern)(一):策略模式介绍
一、意图 定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。二、适用性1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。3、 对客户隐藏具体策略(算
2013-05-11 09:39:20
1794
原创 单件模式(Singleton Pattern)(二):HeadFirst中的巧克力工厂的设计
以《HeadFirst设计模式》中的巧克力工厂为例,介绍单件模式的使用场景。一、问题描述 现代化的巧克力工厂具备计算机控制的巧克力锅炉,锅炉做的事就是把巧克力和牛奶融在一起,然后送到下一个阶段,以制造成巧克力棒。Choc-O-Holic公司有一个巧克力锅炉控制器用于控制锅炉活动的进行,比如:锅炉内为空时才允许加入原料、锅炉内存在原料并且尚未煮沸时才允许进行煮沸、排出牛奶
2013-05-11 09:24:26
3874
原创 单件模式(Singleton Pattern)(一):单件模式介绍
一、意图 单件模式(又称单例模式)确保一个类只有一个实例,并提供一个全局访问点。二、适用性1.当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。2.当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。三、结构四、单件模式的经典实现使用java实现单例模式
2013-05-11 09:23:31
10631
原创 观察者模式(Observer Pattern)(三):使用java内置的支持实现HeadFirst气象站
一、问题描述Weather-O-Rama气象站计划建立下一代的Internet气象观察站,该气象站必须建立在WeatherData对象的基础上,WeatherData对象提供天气数据,有三种布告板,分别显示目前的状况、气象统计及简单的预报。并且以后可以方便地增加布告板进行扩展。使用观察者模式进行设计,WeatherData对象即观察者模式中的主题对象,三个布告板即观察者。
2013-05-11 08:52:13
2772
原创 观察者模式(Observer Pattern)(二):HeadFirst中的气象站的实现
一、问题描述Weather-O-Rama气象站计划建立下一代的Internet气象观察站,该气象站必须建立在WeatherData对象的基础上,WeatherData对象提供天气数据,有三种布告板,分别显示目前的状况、气象统计及简单的预报。并且以后可以方便地增加布告板进行扩展。使用观察者模式进行设计,WeatherData对象即观察者模式中的主题对象,三个布告板即观察者。
2013-05-11 08:51:08
3834
3
原创 观察者模式(Observer Pattern)(一):观察者模式介绍
一、意图定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。二、适用性《设计模式》中提到在以下任一情况下可以使用观察者模式:1.当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。2.当对一个对象的改变需要同时改变
2013-05-11 08:49:34
5551
原创 装饰者模式(Decorator Pattern)(二):HeadFirst中咖啡添加调料
一、问题描述为星巴兹咖啡连锁店设计饮料菜单,咖啡可加的调料有豆浆、牛奶、摩卡等。可在咖啡的基础上加入不同的调料,星巴兹会根据所加的调料收取不同的费用,要注意到,以后可能有新的调料被加入进来供顾客选择。并且本店现有DarkRoast(深焙)、HouseBlend(综合)、Decaf(低咖啡因)及Espresso(浓咖啡)四种类型的咖啡,而且以后可能会添加新的咖啡种类。使用装饰
2013-05-11 08:47:57
2756
原创 装饰者模式(Decorator Pattern)(一):装饰者模式介绍
一、意图装饰者模式(又称装饰模式、包装(Wrapper)模式):动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。二、适用性以下情况使用Decorator模式(摘自《设计模式》):• 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。• 处理那些可以撤消的职责。• 当不能采用生成子类的方法进行扩充时。
2013-05-11 08:45:28
4070
原创 Hibernate事件系统及监听器
1.Hibernate事件系统(Event System)及监听器•如果需要响应持久层的某些特殊事件,你也可以使用Hibernate的事件框架。 该事件系统可以用来替代拦截器,也可以作为拦截器的补充来使用。•基本上,Session接口的每个方法都有相对应的事件。比如 LoadEvent(对应session.load()方法),FlushEvent(对应session.flush
2013-03-30 16:09:27
6164
原创 Hibernate拦截器
•持久层框架底层的拦截器机制是对诸如Spring等业务管理容器拦截机制的有益补充,使得我们可以在更低层次、更广的对象范围上进行AOP操作(Spring虽然将Hibernate纳入到其容器管理的范围内,但是并没有途径实现对其实体对象的管理)。这样就允许实现某些通用的功能,以及允许对Hibernate功能进行扩展。•Interceptor接口提供了从会话(session)回调(callback)应
2013-03-29 20:56:35
3079
1
原创 Hibernate乐观锁与悲观锁
1、Pessimistic Locking 悲观锁:它指的是对数据被外界修改持保守态度。假定任何时刻存取数据时,都可能有另一个客户也正在存取同一笔数据,为了保持数据被操作的一致性,于是对数据采取了数据库层次的锁定状态,依靠数据库提供的锁机制来实现。基于jdbc实现的数据库加锁如下: select * from account where name="mary" fo
2013-03-28 18:59:41
4164
原创 数据库事务与隔离级别
1.数据库事务的概念:•事务是指一组相互依赖的操作行为,如银行交易、股票交易或网上购物。事务的成功取决于这些相互依赖的操作行为是否都能执行成功,只要有一个操作行为失败,就意味着整个事务失败。例如,Tom到银行办理转账事务,把100元钱转到Jack的账号上,这个事务包含以下操作行为:–(1)从Tom的账户上减去100元。–(2)往Jack的账户上增加100元。•显
2013-03-28 16:48:50
17759
原创 Hibernate检索对象的方式
Hibernate提供的检索对象的方式有:•导航对象图检索方式–根据已经加载的对象,导航到其他对象。例如,对于已经加载的Customer对象,调用它的getOrders().iterator()方法就可以导航到所有关联的Order对象,假如在关联级别使用了延迟加载检索策略,那么首次执行此方法时,Hibernate会从数据库中加载关联的Order对象,否则就从缓存中取得Order对象
2013-03-25 21:51:57
905
原创 Hibernate的对象检索策略
Hibernate的对象检索策略分为三种:–立即检索策略–延迟检索策略–左外连接检索策略1.立即检索策略:以Customer和Order(两者为一对多关联关系)为例:List customerLists=session.createQuery("from Customer as c").list();•运行以上方法时,Hibernate将先查询C
2013-03-25 20:07:37
938
原创 Hibernate缓存简介及领域对象的三种状态
1. Session级别的缓存又叫做一级缓存;SessionFactory级别的缓存叫做二级缓存。2.理解Session的缓存:•当Session的save()方法持久化一个Customer对象时,Customer对象被加入到Session的缓存中,以后即使应用程序中的引用变量不再引用Customer对象,只要Session的缓存还没有被清空,Customer对象仍然处于生命周期中
2013-03-25 19:08:38
2592
原创 Query的list()和iterate()方法的区别
1.Query接口的list与iterate方法:iterate()方法:Return the query results as an Iterator. Ifthe query contains multiple results pre row, the results are returned in aninstance ofObject[].Entities returned a
2013-03-25 19:08:09
13655
1
原创 Hibernate继承映射与多态查询
一、继承映射:关系数据库的表之间不存在继承关系,为了把域模型的继承关系映射到数据库中,Hibernate提供了以下三种对继承关系映射的方法:每个子类一张表一张表存储继承体系中所有类的信息(该表由继承体系中所有类的属性的并集所映射的字段组成)公共信息放在父类表中,独有信息放在子类表中,每个子类对应一张表,并且子类表通过外键与父类表关联以Person类和
2013-03-24 21:31:04
10560
5
原创 Hibernate组件映射
在Hibernate中,component是某个实体的逻辑组成部分,它与实体的根本区别是没有oid(对象标识符),component是一个被包含的对象,它作为值类型被持久化,而非一个实体。下面举两个例子说明其使用和配置:1.以User和Address为例,一个User有id(Long类型)、name(String类型)、address地址(Address类型),其中Address类中没有i
2013-03-23 19:41:09
5067
3
原创 Hibernate一对一双向关联
一对一映射有两种方式:主键关联和外键关联。以User类和IdCard类为例,用户和身份证是一对一的双向关联关系。持久化类User:public class User { private Long id; private String name; private IdCard idCard; //省略set、get方法}持久化类IdCard:public class
2013-03-23 19:37:12
12562
6
原创 Hibernate联合主键映射
1.联合主键的映射规则1) 类中的每个主键属性都对应到数据表中的每个主键列。Hibernate要求具有联合主键的实体类实现Serializable接口,并且重写hashCode与equals方法,重写这两个方法的原因在于Hibernate要根据数据库的联合主键来判断某两行记录是否是一样的,如果一样那么就认为是同一个对象,如果不一样,那么就认为是不同的对象。这反映到程序领域中就是根据hash
2013-03-22 14:33:32
31742
2
原创 Hibernate查询结果排序
1.对于一般的查询排序,可以使用HQL语句,例:Student类有两个属性id和name,对应表中的字段分别为id和NName;查询表中的所有记录并按name升序排序 Query q=session.createQuery("from Student order by name asc"); List li=(List)q.list();
2013-03-21 21:16:02
35494
1
原创 Hibernate多对多双向关联
以Student和Course为例,一个学生可以选多门课程,一门课程也可以被多个学生选取;持久化类Student:package bean;import java.util.Set;public class Student { private long id; private String name;//学生姓名 private Set courses;//该学生选择的课
2013-03-21 11:49:08
17337
8
转载 Servlet 中文乱码问题及解决方案剖析
一、常识了解1.GBK包含GB2312,即如果通过GB2312编码后可以通过GBK解码,反之可能不成立;2.java.nio.charset.Charset.defaultCharset() 获得平台默认字符编码;3.getBytes() 是通过平台默认字符集进行编码;二、中文乱码出现在学习任何一门技术时,经常会有初学者遇到中文乱码问题,比如MySQL,
2013-03-20 17:42:57
789
原创 Hibernate映射Bag
Bag(结合了List与Set),可以重复且没有顺序的一种集合,是Hibernate提供的。HIbernate使用jdk的List模拟Bag。其配置与Hibernate映射List时基本相同。以Team、Student为例:持久化类Team(与映射List时相同):package bean;import java.util.List;public class Team { p
2013-03-18 20:04:57
10543
1
原创 Hibernate映射List
Hibernate映射List,其中List中的元素可以是String、Long、Date等可以直接映射到字段上的java类型,较为复杂的就是List中的元素的类型为我们自定义的类型。以Team类为例:(1)映射的List中的元素为我们自定义的Student类型:持久化类Team:package bean;import java.util.List;public cla
2013-03-18 11:06:39
13269
1
原创 Hibernate映射Set
Hibernate映射Set,其中Set集合中可以放我们自定义的类,也可以是像String、Long、Date等能够直接映射到数据库表字段上的类型,后者相对来说比较简单。以Team类为例:package bean;import java.util.Set;public class Team { private long id; private String name; p
2013-03-17 21:15:10
2900
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人