`
FansUnion
  • 浏览: 154848 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

对象的3种运行模式

 
阅读更多
在实际编程过程中,对象将表现为三种不同的形态和运行模式。
对象的运行模式是根据对象的构成特点来划分的。这三种对象的运行模式,我们分别以文字和代码来说明。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
属性--行为模式
这种模式是指一个对象同时拥有属性定义和方法定义。这是对象最为普遍的一种运行模式,绝大多数对象都运作在这种模式上之上。
观点:将对象运作在“属性-行为”模式下,最符合面向对象编程思想的本意。
为什么这么说呢?
1.当对象运行在“属性-行为”模式上时,我们能够最大程度地应用各种设计模式。
对于设计模式有深入研究的读者,应该会同意这个观点。设计模式的存在基础是对象,因而设计模式自身的分类也围绕着对象展开。我们可以发现,绝大多数的设计模式需要通过类、接口、属性、方法这些语法元素的共同配合才能完成。因而,单一的属性模式和行为模式的对象,在设计模式的应用上很难施展拳脚。
2.当对象运作在“属性-行为”模式上时,我们能够最大地发挥对象之间的协作能力。
仔细分析对象的关系模型,我们会发现无论是对象的从属关系还是对象的协作关系,它们在绝大多数情况是通过对象之间的属性引用来完成的。这种属性引用的方式,只是在形式上解决了对象和对象之间进行关联的问题。而真正谈到对象之间的配合,则不可避免地需要通过行为动作的逻辑调用来完成,这也是对象协作的本质内容。
设计模式--策略模式
package org.leiwen.dp.action.stragety;
//现金收费抽象类
public abstract class CashSuper {
// 使用枚举类型表示收费类型
public enum PayType {
CASH_NORMAL, CASH_RETURN, CASH_REBATE
};
// 现金收取抽象类的抽象方法,收取现金,参数为原价,返回值为当前价
public abstract double acceptCash(double money);
}

public class CashNormal extends CashSuper {
//正常收费,原价返回
public double acceptCash(double money) {
return money;
}
}
public class CashRebate extends CashSuper {
private double moneyRebate = 1;
//打折收费,初始化时,需要输入折扣率,如八折,就是0.8
public CashRebate(double moneyRebate) {
this.moneyRebate = moneyRebate;
}
public double acceptCash(double money) {
return money * moneyRebate;
}
}
public class CashReturn extends CashSuper {
private double moneyCondition = 0.0;
private double moneyReturn = 0.0;
// 返利收费,初始化时必须要输入返利条件和返利值,比如满300返100,则moneyCondition=300,moneyReturn=100
public CashReturn(double moneyCondition, double moneyReturn) {
this.moneyCondition = moneyCondition;
this.moneyReturn = moneyReturn;
}
public double acceptCash(double money) {
double result = money;
//若大于返利条件,则需要减去返利值
if (money >= moneyCondition) {
result = money - Math.floor(money / moneyCondition) * moneyReturn;
}
return result;
}
}
public class CashFactory {
public static CashSuper createCashAccept(PayType payType) {
CashSuper cs = null;
// 根据条件返回相应的对象
switch (payType) {
case CASH_NORMAL:
cs = new CashNormal();
break;
case CASH_RETURN:
cs = new CashReturn(200, 100);
break;
case CASH_REBATE:
cs = new CashRebate(0.8);
break;
default:
break;
}
return cs;
}
}
//策略模式实现
public class CashContext {
private CashSuper cs;
//通过构造方法,传入具体的收费策略
public CashContext(CashSuper cs) {
this.cs = cs;
}
public double getResult(double money) {
//根据收费策略的不同,获得计算结果
return cs.acceptCash(money);
}
}
public class StragetyTest {
public static void main(String[] args) {
// 测试策略模式的实现
CashSuper cs = CashFactory
.createCashAccept(PayType.CASH_REBATE);
CashContext context = new CashContext(cs);
double money = context.getResult(200);
System.out.println("实收:" + money + "元");
}
}
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
属性模式
这种模式是指一个对象只拥有属性定义,抚之以相应的setter和getter方法。Java规范为运行在这种模式下的对象取了一个统一的名称:JavaBean。JavaBean从其表现出来的特性看,可以作为数据的存储模式和数据的传输载体。
//注册用户
public class User{
private Integer id;
private String name;
private String email;
//这里省略了所有的getter和setter方法
}
观点:JavaBean对象的产生,主要是为了强调对象的内在特性的状态,同时构造一个数据存储和数据传输的载体。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
行为模式
这种模式是指构成一个对象的主体是一系列方法的定义,而并不含有具体的属性定义,或者说即使含有一些属性定义,也是一些无状态的协作对象。运行在这种模式之下的对象,我们往往称之为“无状态对象”,其中最为常见的例子是我们熟悉的Servlet对象。
所谓的无状态对象实际上就是指对象的方法所表达的行为特性并不依赖于对象的内部属性的状态。
而这种无状态的对象,非常适合进行一个请求的响应,并在方法体的内部实现中,进行复杂的业务逻辑处理。
/**
*Struts2框架中的Http请求中的处理类,实现了Servlet标准中的Filter接口
*/
public class StrutsPrepareAndExecuteFilter implements StrutsStatics, Filter {
// 进行Http请求预处理的操作类
protected PrepareOperations prepare;
// 进行Http请求的逻辑执行处理类
protected ExecuteOperations execute;
// 配置哪些形式的URL模式被排除在Struts2的处理之外
protected List<Pattern> excludedPatterns = null;
/**
* 创建Dispatcher,此类是一个Delegate,它是真正完成url解析,读取对应Action的地方
*
* Filter的初始化过程
*
* init方法的主要内容是针对Dispatcher(核心分发器)、PrepareOperations(Http预处理类)
* 和ExecuteOperations(Http处理逻辑执行类)这3个元素展开的。
*/
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化操作类
InitOperations init = new InitOperations();
try {
// filterConfig对象由Web容器传递进来的
FilterHostConfig config = new FilterHostConfig(filterConfig);
// 初始化日志,FilterHostConfig实现了HostConfig接口
init.initLogging(config);
// 初始化核心分发器Dispatcher
Dispatcher dispatcher = init.initDispatcher(config);
// 初始化静态资源加载器
init.initStaticContentLoader(config, dispatcher);
// 初始化进行Http请求预处理的操作类
prepare = new PrepareOperations(filterConfig.getServletContext(),
dispatcher);
// 初始化进行Http请求处理的逻辑执行的操作类
execute = new ExecuteOperations(filterConfig.getServletContext(),
dispatcher);
// 初始化被Struts2排除在外的URL模式
this.excludedPatterns = init.buildExcludedPatternsList(dispatcher);
// 自定义的初始化过程,留作用户扩展
postInit(dispatcher, filterConfig);
} finally {
// 初始化中的清理工作
init.cleanup();
}
}
/**
* Callback for post initialization 初始化中的扩展工作
*/
protected void postInit(Dispatcher dispatcher, FilterConfig filterConfig) {
}
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
try {
// PerpareOperations对象本身只是一个操作代理接口,真正完成逻辑功能的是Dispatcher本身。
// PerpareOperations在内部实现中所做的,只是对每个操作做了一个简单的转发处理。
// ==== 步骤1开始====
// 设置Encoding和Locale,Encoding和Locale是Web页面上的重要属性,也是Web程序进行国际化处理的核心参数。
// 因而在Http请求预处理的第一步就做这两个参数的设置也相当合理。
prepare.setEncodingAndLocale(request, response);
// ==== 步骤1结束====
// ==== 步骤2开始====
// 创建Action执行对应的ActionContext
prepare.createActionContext(request, response);
// ==== 步骤2结束====
// ==== 步骤3开始====
// 把核心分发器Dispatcher绑定到当前线程
prepare.assignDispatcherToThread();
// ==== 步骤3结束====
// 处理被过滤的URL
if (excludedPatterns != null
&& prepare.isUrlExcluded(request, excludedPatterns)) {
chain.doFilter(request, response);
} else {
// 真正需要进行URL处理的逻辑开始
// ==== 步骤4开始====
// 首先对request进行一定的封装
request = prepare.wrapRequest(request);
// ==== 步骤4结束====
// ==== 步骤5开始====
// 根据url取得对应的Action的配置信息--ActionMapping,actionMapper是通过Container的inject注入的
ActionMapping mapping = prepare.findActionMapping(request,
response, true);
// 从数据结构上看,ActionMapping只是一个很普通的Java对象,然而它却意义非凡,因为它所表达的意思是将一个URL
// 形式的Http请求与Struts2中的Action建立起关系来。ActionMapper才是Struts2进行URL
// Mapping关系查找的核心类。
// ==== 步骤5结束====
// 没有找到对应的ActionMapping
if (mapping == null) {
// 判断是否将URL处理为静态资源
boolean handled = execute.executeStaticResourceRequest(
request, response);
if (!handled) {
chain.doFilter(request, response);
}
} else {
// 执行URL请求的处理
//将所有的参数传入Dispatcher中执行逻辑
execute.executeAction(request, response, mapping);
}
}
} finally {
// 清理request
prepare.cleanupRequest(request);
}
}
public void destroy() {
// 清理核心分发器dispatcher
prepare.cleanupDispatcher();
}
}
分享到:
评论

相关推荐

    设计模式可复用面向对象软件的基础.zip

    书名: 设计模式可复用面向对象软件的基础 英文原书名: Design Patterns:Elements of Reusable Object-Oriented software 作者: Erich Gamma 等 译者: 李英军 马晓星 蔡敏 刘建中 书号: 7-111-07575-7 页码: 254 定价...

    c#面向对象23种设计模式手册

    在介绍每种模式时,给出了一个或多个应用该模式的示例,以便于理解,且这些示例都是能完全运行的程序,包含在随书附带的光盘中。此外,每一章还提供了UML图,用以说明类之间的关系。 本书适用于计算机及相关专业的...

    设计模式:可复用面向对象软件的基础--详细书签版

    作者从多年的面向对象设计经验中精选了23个模式,这构成了该书的精华部份,每一个精益求精的优秀程序员都应拥有这本《设计模式》。”--larry o'brien, software development    “[设计模式]在实用环境下特别有用,...

    空对象模式虚函数实现运行时多态策略模式

    空对象模式虚函数实现运行时多态策略模式 Java源码+运行结果+UML类图+分析文档

    Java面向对象程序设计杨晓燕面向对象基本原则和模式.pptx

    第3页/共30页 Java面向对象程序设计杨晓燕面向对象基本原则和模式全文共30页,当前为第3页。 UML类图及关系 第4页/共30页 Java面向对象程序设计杨晓燕面向对象基本原则和模式全文共30页,当前为第4页。 接口的UML...

    Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides23种设计模式

    1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象接口 9 1.6.4 描述对象...

    设计模式可复用面向对象软件的基础.

    设计模式可复用面向对象软件的基础. 目 录 序言 前言 读者指南 第1章 引言 1 1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决...

    设计模式:可复用面向对象软件的基础

    1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象接口 9 1.6.4 描述对象...

    java23种设计模式+23个实例demo

    java23种设计模式+23个实例demo: 关于代码的几点说明: 1. 代码为根据个人对Design Pattern的学习理解写出, 2. 每个Pattern均是一个目录,其目录名即是Pattern的名字, 所有代码用JDeveloper 9i 和JBuilder 6.0编写...

    C++设计模式例程,工厂模式例子

    C++设计模式例程,工厂模式例子,环境是VS2019打开即可运行 工厂模式也是平时我们编程用的比较多的一种行为设计模式,它提供了一种创建对象的最佳方式。工厂模式提供了一种创建对象的方式,而无需指定要创建的具体...

    桥接模式和策略模式的区别,内含可运行代码和两者详细区别

    所有模式都可分为类模式和对象模式两种,类模式是继承,对象模式是委托,而桥接模式和策略模式都是将任务委托给另外一个接口去实现,那么两者的区别什么呢?

    《设计模式可复用面向对象软件的基础》

    81.6.1 寻找合适的对象 81.6.2 决定对象的粒度 91.6.3 指定对象接口 91.6.4 描述对象的实现 101.6.5 运用复用机制 131.6.6 关联运行时刻和编译时刻的结构 151.6.7 设计应支持变化 161.7 怎样选择设计模式 191.8 怎样...

    Java 实现的面向对象软件设计模式

    设计模式(Design pattern)是用于面向对象程序设计的、有效提高代码重用效率、有着明确使用...项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我

    设计模式--C++

    3.2 Builder(生成器)—对象创建型模式 633.3 Factory Method(工厂方法)—对象创建型模式 70 3.4 Prototype(原型)—对象创建型模式 87 3.5 Singleton(单件)—对象创建型模式 84 3.6 创建型模式的讨论 89 第 4...

    二十三种设计模式【PDF版】

    3.J2EE 只是适合企业计算应用的框架软件,但是 GoF 的设计模式几乎可以用于任何应用!因此 GoF 的设计模式应该是 J2EE 的重要理论基础之一。 所以说,GoF 的设计模式是 Java 基础知识和 J2EE 框架知识之间一座隐性...

    23种设计模式的java实现

    此目录里包括了一书中所有23种设计模式的实现(Java 版)源码 关于代码的几点说明: 1. 代码为根据个人对Design Pattern的学习理解写出(&gt;90%原创), 难免有错误的地方,希望大家指出。 2. 每个Pattern均是一个...

    《设计模式》中文版(23个设计模式的介绍与运用)

    1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象接口 9 1.6.4 描述对象...

    设计模式(.PDF)

    1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象接口 9 1.6.4 描述对象...

    GOLF设计模式(C++语言版)

    1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象接口 9 1.6.4 ...

Global site tag (gtag.js) - Google Analytics