在实际编程过程中,对象将表现为三种不同的形态和运行模式。
对象的运行模式是根据对象的构成特点来划分的。这三种对象的运行模式,我们分别以文字和代码来说明。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
属性--行为模式
这种模式是指一个对象同时拥有属性定义和方法定义。这是对象最为普遍的一种运行模式,绝大多数对象都运作在这种模式上之上。
观点:将对象运作在“属性-行为”模式下,最符合面向对象编程思想的本意。
为什么这么说呢?
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();
}
}
分享到:
相关推荐
代理模式是面向对象设计模式中的一个关键概念,它在软件工程中扮演着重要角色,用于在客户端和目标对象之间创建一种代理关系,以提供额外的功能或控制。在代理模式中,代理类作为真实对象的代表,它可以在客户端与...
LabVIEW有两种主要的运行模式:开发模式和运行时模式。开发模式用于编写、调试和测试代码,而运行时模式则是在应用程序生成为.exe文件后独立运行时的状态。 开发模式下,你可以方便地访问LabVIEW的各种工具,如前...
空对象模式是一种行为设计模式,它的主要目的是在系统中处理"无对象"的情况,避免程序出现空指针异常或者条件判断。在空对象模式中,我们会创建一个"空对象"来代表"无对象"的状态,这个空对象会提供与真实对象相同的...
根据给定的信息,我们可以深入探讨这本《c#面向对象23种设计模式手册》中的设计模式知识点。这本书不仅适合初学者快速上手C#语言和面向对象编程的基础概念,同时也为进阶学习者提供了丰富的设计模式案例。下面将详细...
3. **工厂模式**:工厂模式是一种创建型模式,它提供了一个创建对象的接口,但允许子类决定实例化哪一个类。例如,一个图形界面库可能会有一个工厂类,根据用户的选择创建不同类型的按钮。 4. **状态模式**:状态...
3. **命令模式(Command Pattern)**:命令模式将请求封装为一个对象,使得可以使用不同的请求、队列请求或记录请求,同时支持可撤销的操作。19.命令模式Command则演示了如何利用函数指针(或者在C++11之后的std::...
书名: 设计模式可复用面向对象软件的基础 英文原书名: Design Patterns:Elements of Reusable Object-Oriented software 作者: Erich Gamma 等 译者: 李英军 马晓星 蔡敏 刘建中 书号: 7-111-07575-7 页码: 254 定价...
这二十三种设计模式涵盖了面向对象设计的各个方面,每一种模式都有其适用的场景和解决的问题。了解和掌握这些设计模式,可以帮助程序员写出更加灵活、可维护、可扩展的代码,提高软件开发的效率和质量。
这些内容涵盖了C++中数据结构和算法的基本概念、设计模式、以及如何通过面向对象的方法来实现这些模式。知识点涵盖了从基础的数据结构(如数组、链表、栈、队列)到更高级的概念(如设计模式、算法的渐近分析),还...
3. **代理模式**:`07代理模式`讲解了如何创建一个代理对象来控制对原对象的访问。代理可以增加额外的功能,如监控、缓存、安全控制等,同时保持与原始对象相同的接口。 4. **观察者模式**:这个模式定义了一种一对...
本篇将详细探讨"二十三种设计模式"在C++中的应用及其重要性。 首先,我们要了解设计模式的分类:创建型模式、结构型模式和行为型模式。创建型模式关注对象的创建,如单例模式(Singleton)、工厂模式(Factory ...
装饰器模式允许在运行时动态地给对象添加新的职责,而观察者模式则定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。 学习和理解这23种设计模式,能够...
总的来说,空对象模式是一种实用的设计模式,它通过提供一个默认行为的占位对象,确保了即使在对象缺失的情况下,程序也能保持正常运行,降低了因空指针引用引发的异常风险。在iOS开发中,掌握并灵活运用空对象模式...
作者从多年的面向对象设计经验中精选了23个模式,这构成了该书的精华部份,每一个精益求精的优秀程序员都应拥有这本《设计模式》。”--larry o'brien, software development “[设计模式]在实用环境下特别有用,...
### Java常用的二十三种设计模式 #### 1. 工厂模式(Factory) 工厂模式是一种常用的创建型设计模式,它的核心思想是通过一个专门的类(即工厂类)来负责创建对象,而不是直接通过new关键字实例化对象。这种方式...
《深入探索C++对象模型》是一本深度剖析C++编程语言内部机制的著作,而设计模式则是软件工程中的一种最佳实践,是解决常见问题的模板。这两者结合在一起,为开发者提供了理解C++如何实现面向对象特性以及如何高效地...
面向对象设计模式是软件设计中的一种重要思想,它提供了一种灵活、可维护、可扩展的软件设计方法。以下是十个基本的设计模式的总结和类图: 一、策略模式 定义:定义了一个算法家族,当有一些算法和策略,而且这些...
3. **异步调用模式**:允许程序在等待长时间运行的操作完成的同时继续执行其他任务,从而提高系统的响应速度。 ### 联网对象模式 #### 网络通信基础 在网络应用中,不同计算机之间需要通过协议进行通信,这些协议...
在这个"Java23种设计模式可直接运行Demo.rar"压缩包中,包含了全部23种经典的GOF(GoF,Gamma, Helm, Johnson, Vlissides四位作者)设计模式的Java实现,这些模式包括创建型、结构型和行为型三大类。 1. **创建型...