类间的耦合关系

归类:

1.继承(extends),也称泛化(generalization)

2.实现(implements)

3.组合(composition)

4.聚合(aggregation)

5.关联(association)

6.依赖(dependency)

说明:

继承:

子类继承父类,子类与父类之间形成的耦合关系称之为继承关系(泛化关系)。

耦合方向:父类到子类

实现:

一个类实现了一个接口,这个类与接口之间形成的耦合关系就是实现关系。

耦合方向:接口到实现类

组合:

是一种关联关系的特例,语义上体现为contains-a关系,组合关系比聚合更强,也成为强聚合。它同样体现整体和部分的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束。代码层面和关联关系一致,只能从语义级别区分。

耦合方向:部分到整体

聚合:

也是一种关联关系的特例,语义上体现为has-a关系。它也体现了整体与部分的关系,但是此时整体与部分之间是可分离的,部分可以属于多个整体对象,他们具有各自的生命周期。

耦合方向:部分到整体

关联:

是一种强的耦合关系,这种关系比依赖关系的耦合更强。在代码层面体现为:一个类(部分)以成员变量的角色在另一个类(整体)中存在。

耦合方向:部分到整体

依赖:

一种弱的耦合关系。代码层面体现为:一个类(提供者)以局部变量,方法的参数,以及对静态方法的调用的角色在另一个类(调用者)中存在。

耦合方向:提供者到调用者

谈谈耦合方向:

所谓耦合方向也是依赖方向。如果A类与B类存在耦合关系,当A类发生变化(可能是增加新的方法,修改了已有的方法的方法描述,删除方法等等)导致B类需要做出调整。则认为耦合方向是从A类到B类。耦合方面描述了变化方向。

在代码层面区分组合与聚合(个人观点):

首先,组合与聚合都是是一种关联关系,体现的都是一种整体与部分的关系,即都会以成员变量的角色表现。而两者的生命周期的区别如何在代码层面体现呢?以java为例,要实现此目的,就必须在整体对象的外部保持局部对象的引用。所以在整体对象的外部是否存在局部对象的引用,应该可以作为组合与耦合在代码层面的区别了。

我认为可以有以下三种形式:

1.构造函数的参数

即部分对象作为构造函数的参数传递给整体对象。因为在整体对象构造之前全局对象就已经存在了(生命周期不一样)。

2.public访问符修饰

全局对象创建之后,可以直接改变局部对象,甚至重新给全局对象赋值一个新的局部对象。

3.get/set方法

全局对象提供了局部成员对象的get或set方法

常见的变化种类:

增加方法,删除方法,改变方法描述符(删除方法+新增方法),增加成员变量,删除成员变量

强弱比较

实现>继承>组合>聚合>关联>依赖

各种关系强弱的比较标准: 被依赖的类的发生各种变化之后,依赖它的类(有耦合关系)也需要变化的可能性大小。

为什么实现比继承更强?因为实现中实现类必须与接口完全一致,当接口发生任何变化的时候,实现类都会变化。而继承关系中子类是为扩展父类,父类即使添加新功能(增加新方法),子类也无需变化。所以在使用接口时,一旦确定了接口就很少改变该接口,最好是新增一个接口类,实现类同时实现多个接口。

研究耦合关系的意义

面向对象编程活动,从耦合关系的角度来看,就是使用以上六种耦合关系来描述实际问题。而程序的优劣也可以根据其中存在的耦合关系是否合适来判断。

面向对象的基本原则,设计模式,六种耦合关系三者之间也存在重要的联系。设计原则的地位是最高的,设计模式是实现原则的手段,而六种耦合关系支撑设计模式的基本要素。设计模式的内容总体上包括:类(包括接口)的划分,类(包括接口)之间的关系。其中类之间的关系就是类之间的耦合关系。

参考:

http://www.cnblogs.com/yyyyy5101/archive/2011/03/11/1981078.html

http://www.360doc.com/content/13/0304/13/10504424_269223190.shtml

数据处理场景下的”数据类型”总结

数据处理(任何编程过程)中会遇到的数据类型总体上可分为两大类: 值类型, 结构类型(对象类型,引用类型,结构体)

值类型在形态上大体可分为三类:二进制,数字,字符串

结构类型在形态上也可分为三类:空(null),数组,普通对象

所以我们在进行数据处理相关的编程时,需要对以上各种数据类型一一论证;另一方面我们在学习相关的技术或知识的时候,应该对以上各种数据类型的处理场景检查,这样才能更加全面的学习这种技术或知识。

java获取行号

package org.lr.explore;

import java.text.SimpleDateFormat;
import java.util.Date;

public class LineNumberDemo {

	/**
	 * 如何获取当前语句在java文件中所处的行号
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		Logger logger = new Logger(LineNumberDemo.class);
		logger.debug("调试日志");
		logger.info("信息日志");
	}
	
	public String getLineNumber(){
		StackTraceElement[] ste = (Thread.currentThread()).getStackTrace();
		return ste[1].getLineNumber()+"";
	}
}

class Logger{
	private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss SSS");
	private String cn = "";
	public Logger(Class<?> c){
		cn = c.getSimpleName()+".java";
	}
	
	private String getTime(){
		return sdf.format(new Date());
	}
	
	public void debug(Object msg){
		StackTraceElement[] ste = (Thread.currentThread()).getStackTrace();
		long line = ste[2].getLineNumber();
		System.out.println(getTime()+" DEBUG: "+msg+"("+cn+":"+line+")");
	}
	
	public void info(Object msg){
		StackTraceElement[] ste = (new Exception()).getStackTrace();
		long line = ste[1].getLineNumber();
		System.out.println(getTime()+" INFO: "+msg+"("+cn+":"+line+")");
	}
}

输出:

2016-04-12 05:51:09 303 DEBUG: 调试日志(LineNumberDemo.java:15)
2016-04-12 05:51:09 304 INFO: 信息日志(LineNumberDemo.java:16)

设计模式

(一)接口型模式

1.适配器模式

2.外观模式

3.合成模式

4.桥接模式

(二)职责型模式

5.单列模式

6.观察者模式

7.调停者模式

8.代理模式

9.职责链模式

10.享元模式

(三)构造性模式

11.构建者模式

12.工厂方法模式

13.抽象工厂模式

14.原型模式

15.备忘录模式

(四)操作型模式

16.模板方法模式

17.状态模式

18.策略模式

19.命令模式

20.解释器模式

(五)扩展型模式

21.装饰器模式

22.迭代器模式

23.访问者模式

(六)新模式

24.NullObject模式

java相关技术

Guava类库

Guava类库包含了若干被Google的Java项目广泛依赖的核心库。这些高质量的 API 可以使你的JAVa代码更加优雅,更加简洁。

com.google.common.annotations:普通注解类型。 
com.google.common.base:基本工具类库和接口。 
com.google.common.cache:缓存工具包,非常简单易用且功能强大的JVM内缓存。 
com.google.common.collect:带泛型的集合接口扩展和实现,以及工具类,这里你会发现很多好玩的集合。 
com.google.common.eventbus:发布订阅风格的事件总线。 
com.google.common.hash: 哈希工具包。 
com.google.common.io:I/O工具包。 
com.google.common.math:原始算术类型和超大数的运算工具包。 
com.google.common.net:网络工具包。 
com.google.common.primitives:八种原始类型和无符号类型的静态工具包。 
com.google.common.reflect:反射工具包。 
com.google.common.util.concurrent:多线程工具包。

Preconditions类

Guava类库中的参数检查的类–Preconditions类

Digester

Jakarta Struts中的一个工具。事件驱动,可以XML文件转换成相应的Java对象。在apache-tomcat中有应用。jar包:commons-digester.jar


SAAJ(SOAP with Attachments API for JAVA)

SAAJ支持带附件的SOAP消息。


JAXM(Java API for XML Messaging)
是为Java平台上的应用程序定义的API,用以通过XML(以及SOAP)发送和接收消息,支持同步消息和异步消息。

JAXR(Java API for XML Registries)
与多种类型注册服务进行交互的API。JAXR支持三种注册服务类型:JAXR Pluggable Provider、Registry-specific JAXR Provider、JAXR Bridge Provider(支持UDDI Registry和ebXML Registry/Repository等)。

JAXB(Java Architecture for XML Binding)

是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。


JAF(JavaBeans Activation Framework)

JAF是一个专用的数据处理框架,它用于封装数据,并为应用程序提供访问和操作数据的接口。JAF的主要作用在于让java应用程序知道如何对一个数据源进行查看、编辑和打印等操作。实现:activation.jar


CXF

Apache CXF = Celtix + XFire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了。CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services ,像 JAX-WS 。这些 Services 可以支持多种协议,比如:SOAP、XML/HTTP、RESTful HTTP 或者 CORBA ,并且可以在多种传输协议上运行,比如:HTTP、JMS 或者 JBI,CXF 大大简化了 Services 的创建,同时它继承了 XFire 传统,一样可以天然地和 Spring 进行无缝集成。


AXIS(Apache Extensible Interaction System)

阿帕奇可扩展交互系统,Axis本质上就是一个SOAP引擎,提供创建服务器端、客户端和网关SOAP操作的基本框架。


JVM Attach机制

是jvm提供一种jvm进程间通信的能力,能让一个进程传命令给另外一个进程,并让它执行内部的一些操作,比如说我们为了让另外一个jvm进程把线程dump出来,那么我们跑了一个jstack的进程,然后传了个pid的参数,告诉它要哪个进程进行线程dump,既然是两个进程,那肯定涉及到进程间通信,以及传输协议的定义,比如要执行什么操作,传了什么参数等。


Java线程Dump
线程Dump是非常有用的诊断Java应用问题的工具,每一个Java虚拟机都有及时生成显示所有线程在某一点状态的线程Dump的能力。虽然各个Java虚拟机线程dump打印输出格式上略微有一些不同,但是线程dump出来的信息包含线程基本信息;线程的运行状态、标识和调用的堆栈;调用的堆栈包含完整的类名,所执行的方法,如果可能的话还有源代码的行数。


新技术记录

Oauth

一种授权协议。第三方用户可以获得用户的授权,这些“权限”是可控的,而且第三方用户并不需要接触到用户的登录名及密码等敏感信息。

SASL(Simple Authentication and Security Layer)

是一种用来扩充C/S模式验证能力的机制,SASL提供了一个通用的方法为基于连接的协议增加验证支持

SSL(Secure Socket Layer)

为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。

TLS(Transport Layer Security)

安全传输层协议。SSL协议的继任者。用于在两个通信应用程序之间提供保密性和数据完整性。

单点登录

用户只需要登录一次就可以访问所有相互信任的应用系统。因为这些系统之间共享登录凭证

目录服务(Directory Service)

为用户提供各种目录查询的服务形式,例如:AD,DNS等

DAP

目录访问协议,目录服务的访问协议

LDAP

轻量级目录访问协议(一种目录服务的访问协议),支持TCP/IP

X.500

是一种目录服务系统的标准。目录系统包括:目录服务,目录访问协议等

TDD(Test-Driven Development)

测试驱动开发。是敏捷开发中的一项核心实践和技术,也是一种设计方法论。TDD的原理是在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么产品代码。

BDD(Behavior Driven Development)

行为驱动开发是一种敏捷软件开发的技术,它鼓励软件项目中的开发者、QA和非技术人员或商业参与者之间的协作。主要是从用户的需求出发,强调系统行为。BDD最初是由Dan North在2003年命名,它包括验收测试和客户测试驱动等的极限编程的实践,作为对测试驱动开发的回应。

ATDD(Acceptance Test Driven Development)

验收测试驱动开发

Cucumber

描述的测试用例的支持行为驱动开发(BDD)的自动化测试工具,用Ruby编写。

Hamcrest

一个测试的框架,它提供了一套通用的匹配符Matcher,灵活使用这些匹配符定义的规则,程序员可以更加精确的表达自己的测试思想,指定所想设定的测试条件。支持的语言:Java,Python,Ruby,Objective-C,PHP,Erlang,Swift

ActiveMQ

ActiveMQ是Apache出品,最流行的,能力强劲的开源消息总线。

HotSpot

一种JVM产品,SUN开发

SOA

面向服务的体系结构

LVS(Linux Virtual Server)

一个虚拟的服务器集群系统,1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。

AOM联合格式(Atom Syndication Format)

它是 一种基于XML的超媒体格式。它提供了灵活可扩展的互操作的格式,并且因为基于XML的特点,所以它为跨平台的应用间传递数据提供了很好的支持。

DSL(domain-specific languages)

领域特定语言

Lambda表达式

一种数学表达式

thoughtworks

一家全球软件设计与定制领袖企业。主要通过咨询帮助改善企业的IT组织,改进软件开发方法,以软件带动企业业务发展。

RFID(Radio Frequency Identification)

射频识别技术又称无线射频识别,是一种通信技术,可通过无线电讯号识别特定目标并读写相关数据,而无需识别系统与特定目标之间建立机械或光学接触。

comet

“服务器推”模型,是一种新的 Web 应用架构

模式识别

一门学科,通过计算机用数学技术方法来研究模式的自动处理和判读。

finalize


CPU超线程

对偶原则

模式识别

聚类分析

主成分分析

隐马尔可夫模型

标识管理体系

DOM,SAX,STAX