出版说明

丛书内容

模式系列图书在《设计模式——基于C#的工程化实现及扩展》的基础上充实完成,本系列此版本面向C#开发者和Java开发者提供如下4册图书:

●模式——工程化实现及扩展(设计模式C#版)。

●模式——工程化实现及扩展(架构模式C#版)。

●模式——工程化实现及扩展(设计模式Java版)。

●模式——工程化实现及扩展(架构模式Java版)。

其中,Java版本采用ORACLE Java 7编写,面向Java平台的专业人员;而C#版采用Microsoft C# 4编写,面向.NET平台的专业人员。

设计模式版本仅介绍GOF 23个设计模式的内容,示例情景也主要面向进程内的类型设计;而架构模式版本则从分布式应用角度介绍部分典型的架构模式、数据访问模式、信息安全模式,尽管类型不同,但均为架构所必需的,所以统一纳入架构模式分册,其示例情景一般也存在跨进程调用,采用的也是分布式组件技术。

丛书定位

不管读者阅读的是本系列的Java版本还是C#版本,是设计模式版本还是架构模式版本,它都不是面向入门者的读物。

本丛书的内容是针对中高级开发人员安排的,而部分章节后面的“自我检验”环节,则是针对希望进一步挑战模式技术的软件架构师设计的。

内容要点

本系列的重点不是阐述设计模式GOF和架构模式本身,这些内容可以从Design Patterns:Elements of Reusable Object-Oriented Software一书获得。本系列面向的是模式的实践者。它假设读者已经熟悉Java或C#语法,能熟练运用Java 5/6/7和C# 3/4语法特性,并能充分发掘其中的实践价值,确保工作成果在JVM和CLR&DLR平台上更简洁、明快的实现。本系列还假设读者对Java和C#的编译器有所了解,对于Byte Code或MSIL有一定认识,对于一些要点内容可以从Byte Code或MSIL层面对交付成果进行评析。

在没有其他说明的情况下,本系列各分册所指的《设计模式》是Design Patterns:Elements of Reusable Object-Oriented Software,即《设计模式:可复用面向对象软件的基础》这本书。

对于那些已经融入语言或开发平台的模式,如GOF中的原型模式、命令模式、策略模式、观察者模式、迭代器模式、访问者模式和架构模式中的MVC模式、管道过滤器模式等,我们将尽量采用语言自身的机制完成,读者可能甚至看不到明显的“模式”痕迹,模式的经典实现仅大体介绍模式意图后简要带过。毕竟,工程中“暴殄天物”不值得提倡。

UML标注特点

为了简化类图的篇幅,本系列在所有属性方法(Java中表示访问Field的getXxx/setXxx方法,C#中表示get/set的Property)都采用简略方式定义,而且命名统一采用Pascal Case风格。例如,如图F1-1所示类图等价的Java代码和C#代码如下:

图F1-1 示例类图

Java
public interface Person {
    void promote(String newTitle);
    public String getDepartment();
    public void setDepartment();
    public List<Education> getEducationHistory();
    public void setEducationHistory(List<Education> educationHistory);
    public List<Experience> getWorkingExperience();
    public void setWorkingExperience(List<Experience> workingExperience);
}
C#
public interface IPerson
{
   void Promote(string newTitle);
   string Department { get; set; }
   IList<Education> EducationHistory { get; set; }
   IList<Experience> WorkingExperience { get; set; }
}

示例特点

首先,所有示例代码的实现保持简洁风格,不过考虑到设计模式要解决“变化”问题,所以示例在保持简洁的同时,也适当照顾到“应变”的要求。

由于本书很多介绍都要结合代码,为了尽量减少篇幅,书中的代码基本都做了精简:

●许多接口和类型定义都采用了很不规范的单行书写方式。

●注释一般也进行了裁剪。

●对于与展示实现思路无关的代码、配置文件、示例数据也简略带过。

例如,下面的Java代码和C#代码。如果读者平时负责代码复查或者对代码的书写方式很敏感,我对读者可能会感到的不畅致歉。

Java
/**抽象定义部分*/
interface NamedState{ String getName();}

abstract class NamedStateBase implements NamedState{ protected String name;
protected NamedStateBase(String name){ this.name = name;} public String getName(){return this.name;} }
/**具体类型*/ class ClosedState extends NamedStateBase{…} class OpeningState extends NamedStateBase{…} class OpenedState extends NamedStateBase{…}
C#
/// 具体策略类型
class GetMinSortStrategy : IStrategy{…}
class FirstDataStrategy : IStrategy{…}
class GetMaxStrategy : IStrategy{…}

/// 需要采用可替换策略执行的对象 public class Context : IContext { public IStrategy Strategy { get; set; }
/// 执行对象依赖于策略对象的操作方法 public int GetData(int[] data) { if (strategy == null) throw new NullReferenceException("strategy"); if (data == null) throw new ArgumentNullException("data"); return strategy.PickUp(data); } }

另外,每个模式在实现方式上针对不同的扩展主题,本系列将始终沿用这样的优先级编码实现:

●Java和C#语法特性。

●官方Java SE JDK和.NET Framework的框架内容。

●个别情况考虑集成官方资助的开源框架。

●对于其他第三方提供的开源框架,不列入或不列入本系列的实现示例。

本文中“官方”对Java指Oracle,C#指微软。在没有其他说明的情况下,本系列各分册所提到的《.NET设计规范》是微软MSDN文档中发布的.NET设计规范Design Guidelines for Developing Class Libraries http://msdn.microsoft.com/en-us/ library/ms229042.aspx,而《Java语言编码规范》指的是Oracle发布的Code Conventions for the Java Programming Language,网址为http://www.oracle.com/ technetwork/java/codeconvtoc-136057.html

如何阅读

本系列图书每章都会先对模式的经典介绍做简要评述,说明其主要意图和典型实现示例,然后会结合语言逐步扩充其使用情景,介绍典型的实现技巧。

为了便于读者使用,建议读者按照如下方法阅读本系列各分册图书:

1.了解经典的面向对象设计原则。

2.在熟悉所用编程语言的基础上,投入一定的时间阅读“重新研读Java语言”或“重新研读C#语言”两章,了解工程化代码与“玩具代码”的实现差异。

3.再阅读各章对模式经典内容的介绍,了解为什么需要这个模式、它主要解决什么问题、经典的实现是怎样的。

4.阅读每章的扩展部分,熟悉不同示例环境下如何用更工程化的方式实现扩展要求。为了节省篇幅,书中代码只是代码片段节选,建议读者直接运行示例代码,这样体会更深。

5.分析和体会单元测试的结果。

6.逐步结合自己的项目修改示例代码,真正将书中的“工程化实现和扩展”融入实际工作。

为了便于读者考查自己对于特定模式的掌握程度,本版本在部分章节增加了一个“自我检验”的练习环节,目的是通过一些准案例的介绍,让读者灵活应用该章的知识内容,独立思考解决方案。由于解决方案会不断调整和优化,所有的参考答案会发布在我的个人博客中,解决方案内容也会根据与大家交流的结果不断优化、动态更新。希望这种方式读者能够喜欢。下面是我的个人博客,欢迎读者常来看看。

●CSDN http://blog.csdn.net/firevision/

●博客园 http://www.cnblogs.com/callwangxiang/

●ITEye http://callwangxiang.iteye.com/

最后,祝大家有更好的阅读体验。