摘要:
享元模式是对象的结构模式,享元模式以共享的方式高效地支持大量的细粒度对象。享元对象能做到共享的关键区分内蕴状态和外蕴状态。一个内蕴状态是存储在享元对象内部的,并且是不会随着环境改变而有所不同,因此,一个享元可以具有内蕴状态并可以共享。一个外蕴状态是随着环境改变而改变,不可以共享的状态。享元对象 的外蕴状态必须由客户端保存,并在享元对象被创建之后,在需要使用的时候再传入到享元对象内部。外蕴状态不可以影响享元对象的内蕴状态。换句话说,它们是相互独立的。根据所涉及的享元对象的内部表象,享元模式可以分成单纯享元模式和复合享元模式。单纯享元模式:在单纯享元模式中,所有的享元对象都是可以共享的。单纯享元模 阅读全文
摘要:
代理模式是对象的结构模式,代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。按照使用目的来划分,代理有以下几种:1.远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。优点 是系统可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。客户完全可以认为被代理的对象是局域的,而不是远程的而代理对象承担了大部分的网络通信工作。缺点是客户可能没有意识到会启动一个耗费时间的远程调用,因此客户没有必要的思想准备。2.虚拟(Virtual)代理:根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。代理可以对加载的过程加以必要的优化。当一个模 阅读全文
摘要:
装饰模式以对客户端透明的方式动态地给一个对象附加上更多的责任。客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展。主要有以下角色:1.抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象2.具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类。3.装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口4.具体装饰(Concrete Decorator)角色:负责给构件对象“贴上”附加的责任。示例性代码: 1 public 阅读全文
摘要:
合成(Composite)模型模式属于对象的结构模式,有时又叫部分-整体(Part-Whole)模式。合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式可以使用客户端将单纯元素与复合元素同等看待。抽象构件(Component)角色:抽象角色,它给参加组合的对象规定一个接口。这个角色给出共有的接口及其默认行为。树叶构件(Leaf)角色:代表参加组合的树叶对象。一个树叶没有下级的子对象。定义出参加组合的原始对象的行为。树枝构件(Composite)角色:代表参加组合的有子对象的对象,并给出树枝构件对象的行为。可以看出,Composite类型的对象含有其他的Component类型的 阅读全文
摘要:
结构模式:描述如何将类或者对象结合在一起形成更强大的结构。结构模式描述两种不同的东西:类与类的实例。根据这一不同,结构模式可以分为类的结构模式和对象的结构模式1.类的结构模式:类的结构模式使用继承来把来,接口等组合在一起,以形成更强大的结构。当一个类从父类继承并实现某接口时,这个新的类就把父类的结构和接口的结构结合起来,类的结构模式是静态的。一个类的结构模式的典型例子,就是类形式的适配器模式。2.对象的结构模式:对象的结构模式描述怎样把各种不同类型的对象组合在一起,以实现新的功能的方法。对象的结构模式是动态的。一个典型的对象的结构模式就是代理人模式,其他的例子包括合成模式,享元模式,装饰模式以 阅读全文
摘要:
通过原型对象来指明要创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。原始模型模式有两种表现形式:第一种是简单形式这种形式涉及三个角色:1.客户角色(Client):客户类提出创建对象的请求2.抽象原型角色(Prototype):抽象角色,通常由一个Java接口或Java抽象类实现。此角色给出所有具体原型所需的接口3.具体原型(Concrete Prototype):被复制的对象。此角色需要实现抽象的原型角色所要求的接口。 1 //客户端 2 public class Client { 3 4 private Prototype prototype; 5 ... 阅读全文
摘要:
建造者模式将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象角色:抽象建造者(Builder):给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于程序的商业逻辑。模式中直接创建产品对象的是具体建造者角色。具体建造者类必须实现这个接口所要求的两种方法:一种是建造方法,另一种是结果返回方法一般来说产品包含的零件数目与建造方法的数目相符。有多少零件,就应有多少相应的建造方法具体建造者:这些是与应用程序紧密相关的一些类,这个角色要完成的任务包括:1.实现抽象建造者Builder所声明的接口,给出一步一步完成创建产品实例的操.. 阅读全文
摘要:
Rober C指出,导致一个软件设计的可维护性较低,也就是说会随着性能要求的变化而“腐烂”的真正原因是4个:1.过于僵硬(Rigidity)很难加入一个新功能2.过于脆弱(Fragility)在一个地方的修改,可能会导致其它地方的错误发生3.复用率低(Immobiligy)可以复用的代码总是依赖于其它的代码,导致难以复用4.黏度过高(Viscosity) 在模块之间中搭建桥梁来建立一个新功能一个好的系统设计的目标是:1.可扩展性(Extensibility)2.灵活性(Flexibility)3.可插入性(Pluggability)系统的可扩展性是由“开-闭”原则,里氏代换原则,依赖倒转原则和 阅读全文
摘要:
编辑代码常用快捷键格式化代码的快捷键 Ctrl + Shift + F格式化缩进的快捷键是 Ctrl + I,只能对选中的文本进行缩进删除一行的快捷键是 Ctrl + D当前窗口最大化最小化切换 Ctrl + M转到最后进行修改编辑的位置 Ctrl + Q快速查找选中的字符 Ctrl + K(向下) Ctrl + Shift + K(向上)光标放到一个括号,切换到另一个成对的括号 Ctrl + Shirt + PAlt+shift+S 打开快捷菜单,相当于在源代码上鼠标右键Ctrl + Alt + ↑ 或 Ctrl + Alt + ↓ 复制选中的一段代码Alt + ↑ 或 Alt + ↓ 移动 阅读全文
摘要:
并发集合是原有集合框架的补充,为多线程并发程序提供了支持。主要有:BlockingQueue,ConcurrentMap,ConcurrentNavigableMap三个接口。新的java.util.concurrent包可用的具体集合类中加入了BlockingQueue接口和5个阻塞队列类。阻塞队列实质上就是一种有点扭曲的FIFO数据结构,不是立即从队列中添加或删除元素,线程执行操作被阻塞,直到有空间或元素可用。生产者中 put()操作会在没有空间可用时阻塞,而消费者的take()操作会在队列中没有任何东西时阻塞。五个队列所提供的各有不同:ArrayBlockingQueue :一个由数组支 阅读全文
摘要:
简单工厂模式:描述:简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式。通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。角色职责:1.工厂(Creator)角色简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。2.抽象(Product)角色简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。3.具体产品(Concrete Product)角色简单工厂模式所创建的具体实例对象优缺点:在这个模式中,工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建 阅读全文
摘要:
使用Amino框架Amino是Apache旗下的开源软件。读者可以访问http://amino-cbbs.sourceforge.net/得到其最新版本。面向并发编程,它有以下特点:1) 可操作性和良好的伸缩性2) 跨平台性3) 无论在Java、C++或其他流行语言中,编程风格一致4) 适用于多核的各种操作系统5) 可以进行并发编程正确性的测试Amino Java类库将涉及下面四个方面的内容:1) 数据结构该组件将提供一套免锁的集合类。因为这些数据结构采用免锁的运算法则来生成,所以,它们将拥有基本的免锁组件的特性,如可以避免不同类型的死锁,不同类型的线程初始化顺序等。2) 并行模式Amino将 阅读全文
摘要:
1.面向接口编程(这是Java编程里公认的第一原则)2.优先使用对象组合而非类继承3.分层(表现层,逻辑层,数据层)表现层:展示数据,人机交互,收集参数调用逻辑层逻辑层:进行数据逻辑校验,逻辑判断,实现业务功能,处理相关功能,处理 后续流程,组织数据返回给表现层数据层功能:实现数据持久化,实现对象和持久化数据的双向映射。层间交互的基本原则:1.表现层调用逻辑层,逻辑层调用数据层,不可以反过来2.层间交互也应该通过接口进行调用,以确保各层的实现独立变化。基本原则2:1.开闭原则:就是对新增开放,对修改关闭。应尽量做到不用修改模块的源代码,就能更改模块的行为2.依赖性倒置原则就是依赖抽象而不是依赖 阅读全文
摘要:
Semaphore:类java.util.concurrent.Semaphore提供了一个计数信号量,从概念上讲,信号量维护了一个许可集,如有必要,在许可可用前会阻塞每一个acquire(),然后再获取该许可。每个release()添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore只对可用许可的号码进行计数,并采取相应的行动。调用acquire()时无法保持同步锁,因为这会阻止将数据项返回到池中。信号量封装所需的同步,以限制对池的访问,这同维持该池本身一致性所需的同步是分开的。将信号量初始化为1,使得它在使用时最多只有一个可用的许可,从而可用作一个 阅读全文
摘要:
在JDK5的并发包中有一个子包为java.concurrent.locks,它下面定义了三个接口Lock,ReadWriteLock,Condition,分别为重入锁,读写锁,锁条件判断LOCK:Lock与java关键字(synchronized)具有相同的功能,但它更加灵活。ReentrantLock作为Lock接口的实现类,被作为Java语言中synchronized功能的替代,它们具有相同的内存意义,相同的锁定,但在争用条件下却有更好的性能,此为它还有synchronized没有提供的其它特性。但就实际应用来说,由于内部锁是内置于Java虚拟机中的,它能够进行优化,因此未来的性能改进.. 阅读全文
摘要:
1 import java.util.Timer; 2 import java.util.TimerTask; 3 /** 4 * 传统定时器技术 new Timer().schedule(TimeTaks()实例,多少秒后执行,第一次执行后每隔多少秒执行一次) 5 * new Timer().schedule(TimeTaks()实例,new Date()固定日期执行,第一次执行后每隔多少秒执行一次) 6 * 如果没有最后一个参数,则定时器里的任务只执行一次。 7 * 更复杂的调试任务可以考虑用调度框架quartz 8 */ 9 public class TimerTest... 阅读全文
摘要:
Future和FutureTask接口Future<V>表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用get()方法来获取结果,如有必要,计算完成前可以阻塞此方法。取消则由cancel方法来执行,还提供了其他方法,以确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算了。如果为了可取消性而使用Future但又不提供可用的结果,则可以声明Future<?>形式类型,并返回null作为底层任务的结果。Future主要定义了5个方法:cancle(boolean myaInterruptIfRunning) 阅读全文
摘要:
在JDK5新增并发编程包中有一个子包,java.util.concurrent.atomic,此包中定义了对单一变量执行原子操作的类。所有类都有get和set方法,工作方法和对volatile变量的读取和写入一样。java.util.concurrent.atomic 包中添加原子变量类,所有原子变量类都公开“比较交设置”原语(与比较并交换类似),这些原语都是使用平台上可用的最快的本机结构(比较并交换,加载链接、条件存储,最坏情况下是旋转锁)来实现的。此包提供了原子变量的9种风格(AtomicInteger,AtomicLong,AtomicReference、AtomicBoolean,原子 阅读全文
摘要:
非阻塞NIO使用场景: NIO是Java提供的非阻塞I/O API。 非阻塞的意义在于可以使用一个线程对大量的数据连接进行处理,非常适用于"短数据长连接"的应用场景,例如即时通讯软件。 在一个阻塞C/S系统中,服务器要为每一个客户连接开启一个线程阻塞等待客户端发送的消息.若使用非阻塞技术,服务器可以使用一个线程对连接进行轮询,无须阻塞等待.这大大减少了内存资源的浪费,也避免了服务器在客户线程中不断切换带来的CPU消耗,服务器对CPU的有效使用率大大提高. 与原始IO对比,异步IO是一种没有阻塞地读写数据的方法,通常,在原始IO中,在代码进行read()调用时,代码会阻塞直至 阅读全文
摘要:
Java中Properties类用来处理有键值对的属性文件,利用它可以快速地把属性文件加载到内存,也可以快速把属性存放到文件中。它继承自hashTable类,除了拥有hashTable所有拥有的所有方法外,另外它还附加了用于与文件流操作的方法。下面示例展示了Properties类的用法: 1 public class PropertiesTest { 2 public static void main(String[] args)throws Exception { 3 4 Properties p = new Properties(); 5 ... 阅读全文