方法是 public object invoke ( Object obj, Method method, Object[] args ) (2) , class Proxy 该类主要的内容有: protected Proxy ( InvocationHandler h ) 构造函数,用于给内部的 h 赋值 装饰模式: 装饰模式 在原来类的功能上,对一些功能做一些增强处理,是继承方式的一个替代方案。 举例:JDK 的 java.io.FileReader 和 BufferedReader 类,它们都扩展自 Reader 类。想要为 FileReader 加上缓存的功能,客 户端调用的方法是: new BufferedReader(new FileReader(“myfile.txt”).readLine(); 这两个类都是 Reader 的子类,与 Reader 之间的关系都是继承,而他们之间应该是没有什么关系。 优点:与类继承的方式相比,装饰模式避免了多层的继承关系。 行为模式: 行为模式 模板方法模式 一般化的行为代码移到基类里面,特殊化的行为代码移到子类里面。
理解:模板方法模式把我们不知道具体实现的步聚封装成抽象方法,提供一些按正确顺序调用它们的具体方法(这些具 体方法统称为模板方法),这样构成一个抽象基类。子类通过继承这个抽象基类去实现各个步聚的抽象方法,而
工作流程 却由父类来控制。 另一种说法:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的 结构即可重定义该算法的某些特定步骤。 “好莱坞”原则 举例:HttpServlet 的 service()方法调用 7 个 do 方法中的一个或几个,完成对客户端调用的处理。 JDK 中的例子:
应用:将一个大方法拆分成多个小方法。 扩展思考: 如何体现“开闭”原则,依赖倒转原则
。 举例:浏览器提供了 TemplateMethod,浏览器的插件可以提供具体丰富功能。 观察者模式: 观察者模式
定义了一对多的依赖关系,让多个观察者同时监听某一主题对象的状态变化。当主题对象发生状态变化时,会通知所 有观察者对象,使它们能够自动更新自己。 JDK 中的例子:java.util.Observable 类(被观察者,主题对象)和 Observer 接口(观察者) ,Observer 接口提供了唯一的 update 方法,此方法会自动被
注册过的实现了 Oberservable 接口的被观察者的 notifyOberver 方法调用。一般一个 observable 对象可以有一个或多个观察者(Observer) 。
围观? J2EE 核心模式 ( 架构模式 ):参见《Core J2EE Patterns》一书。 模式的粒度:架构模式 > 设计模式 > 代码模式(成例) 前端控制器(Front Controller)模式 模式: 前端控制器 模式 例子:JSF 的 FacesServlet,Struts 的 ActionServlet 的导航功能 拦截过滤器(Filter)模式 模式: 拦截过滤器 模式 举例:Servlet 的各种 Filter,例如,访问所有其他页面实现未登陆就自动
导航到
登陆页面的功能。 理解:复用的体现 数据访问对象(DAO)模式 模式: 数据访问对象 模式 例子:MyEclipse 为 Hibernate 自动生成的 DAO 代码,屏蔽了数据访问的细节。 会话门面(Session Fa?ade)模式 模式: 会话门面 模式 举例:BO, VO(DTO)
EJB: 分为会话 EJB, 实体 EJB 两类。一般的,一个会话 Bean 中调用多个实体 Bean。 该会话 Bean 是一个 Fa?ade 类/Manager 类, 使用 Fa?ade 会话 Bean 优点: 1. 提供性能,节省客户端直接调用实体 Bean 的
网络开销 2. 解耦分层,利于扩展变化。 传输对象(Transfer Object)模式: 传输对象 模式: 模式 需要跨层传输的多种数据元素时使用,特别是远程对象的传输。不逐个传输单独的数据元素,而是用一个实现了 Serializable 的传输对象。 视图助手(View Helper)模式: 模式: 视图助手 模式 将视图和相关的处理逻辑分开,即使用视图封装显示格式的代码,使用助手封装视图处理逻辑。助手一般通过 POJO、 定制标记或标记文件的形式实现。视图把处理逻辑交由这些助手完成,助手在视图和模型之间充当了适配器的作用。 Spring, Hibernate, Struts, JSF 中用到的模式: Struts: