- 浏览: 62290 次
- 性别:
- 来自: 成都
最新评论
文章列表
迭代器模式:提供一种方法顺序访问一个聚合对象上的各个元素,而又不暴露其内部的表示。
组合设计模式:允许你将对象组成树形结构来表现整体/部分的层次结构。组合能让客户以一致的方式处理个别对象和对象组合。组合模式内的任一对象为主见,实现相同的接口。
模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类在不改变算法结构的情况下,重新定义算法中的某些步骤。
public abstract class Frame {
//定义模板方法
abstract void method();
void method1(){
System.out.println("自定义方法1");
}
void method2(){
System.out.println("自定义方法2");
}
void hook(){
//钩子方法一般提供一个 ...
适配器模式:将一个类的接口,转换成客户期望的另一个类的接口。适配器让原本不兼容的类可以合作无间。
利用对象组合,以修改的接口包装被适配者。
public class EnumerationIterator implements Iterator<Object>{
Enumeration<Object> enumeration;
public EnumerationIterator(Enumeration<Object> enumeration){
this.enumeration = enumeration;
}
@Override
...
命令设计模式:将请求封装成对象,这可以让你使用不同的请求、队列或者日志请求来参数化其他对象。命令模式也可以支持撤销操作。
当需要将发出请求的对象和执行请求的对象解耦的时候使用命令模式。
代码:
//请求调用者
public class CommandMain {
Command command;
public void setCommand(Command command) {
this.command = command;
}
public void execute(){
command.execute();
}
}
//命令对象
publ ...
单例设计模式:确保一个类只有一个实例,并提供全局访问点。
代码1:
public class Singleton {
//volatile修饰防止jvm指令重排引起错误
private volatile static Singleton singleton;;
private Singleton(){
}
public Singleton getInstance(){
if(singleton==null){
synchronized (Singleton.class) { //只有第一次会初始化会进入,提升效率
if(singleton== ...
所有的工厂模式都是用来封装对象的创建。
简单工厂设计模式:建立一个类专门用于对象的实例化。
代码如下:
public class SimpleFactory {
public Product create(String s){
Product product;
switch (s) {
case "1":
product =new Product("小产品");
break;
case "2":
product =new Product("中产品");
...
装饰者设计模式定义:动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
装饰者特点:
1、装饰着和被装饰着具有相同的超类型。
2、通过构造函数注入被装饰对象。
3、装饰者可以在被装饰者方法调用的前后加入自己的行为。这有点类似于静态代理。
实际上装饰者设计模式就是运用组合增强类的方法。java io类就大量应用到了装饰者模式。
代码:
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
...
观察者设计模式定义:定义了对象之间的一对多依赖,这样一来当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。java伪代码实现如下:
import java.util.ArrayList;
public class SubjectImpl implements Subject{//主题是一个接口用于绑定观察者,解绑观察者以及通知
ArrayList<Observer> observers = new ArrayList<Observer>(); //用于保存观察者Observer是一个接口定义观察者要实现的方法
//绑定观察者
@Overr ...
策略设计模式:
概念:定义了算法簇,分别封装起来,让他们之间可以相互替换。此模式让算法的变化独立于使用算法的客户。
个人理解:策略设计模式即是用接口+组合的方式分离实现。伪代码如下:
public abstract class StrategyPatternDuck {
private Cry cry; //接口实现叫这个行为
private Fly fly; //接口实现飞这个行为
public StrategyPatternDuck(Cry cry, Fly fly) {
//通过构造函数注入
thi ...
从网上看到一篇文章讲述垃圾回收的历史搬运过来:
为什么要有GC
我时而听到C++程序员说我们是被GC惯坏了的一代。的确是这样的,我本人在学习GC算法时,大脑里第一问题就是为什么需要GC这样的东西。说明我已经认为GC是理所当然了。
总的一句话:没有GC的世界,我们需要手动进行内存管理,而手动内存管理是纯技术活,又容易出错。
既然我们写的大多程序都是为了解决现实业务问题,那么,我们为什么不把这种纯技术活自动化呢?但是自动化,也是有代价的。 这是我的个人理解,不代表John McCarthy本人的理解。
“垃圾”的定义
首先,我们要给个“垃圾”的定义,才能进行回收吧。书中给出的定义: &g ...
今天看JDK String 源码有一段代码实在没想通,网上也没有什么资料,说说自己的理解。先贴上jdk这一段源码:
public boolean contentEquals(CharSequence cs) {
// Argument is a StringBuffer, StringBuilder
if (cs instanceof AbstractStringBuilder) {
if (cs instanceof StringBuffer) {
synchronized(cs) {
...
刚开始对hibernate jpa不太熟悉,又被sql情有独钟,然后发现jpa查询无法封装到自定义的vo中(这是误区,可以通过jpa查询然后构造函数的形式注入),思前想后,算了,自己封装一个方法直接转成map集合然后封装到集合中。
//实现map到javabean的转换用于兼容hibernate自定义sql封装到bean
public List findPageBeanMapBySQL(String sql, Pageable pageable,Class clazz) {
Query query = entityManager.createNativeQuery(sql);
quer ...
最近项目用到了hibernate的jpa查询,以前这方面接触的少,所以自己熟悉了下jpa的CriteriaQuery查询api。
package com.tc.test;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Tuple;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persis ...
final关键字的主要用于申明这个东西是不可变的。用于设计以及效率。
final参数:用于申明这个参数是不可变的。如果参数是一个常数,那么他将永远不可改变,虚拟机在编译期可以进行一些运算。节省一些开销,提升效率。注意:必须虚拟机在编辑器确认他是一个常数,才可以进行一些运算,如果运行期赋值则不行。
如果final修饰的是一个句柄,那么句柄指向的对象将永远不可改变,但是对象的内容是可以发生变化的。
final修饰方法,代表该方法是不可以继承以及覆盖的。
final修饰类:该类不可以被继承
java for each循环的原理
- 博客分类:
- java
这篇介绍java for each原理的文章写的很棒,转过来marke一下。
http://blog.csdn.net/zhangyuan19880606/article/details/51241079
在编译的时候编译器会自动将对for这个关键字的使用转化为对目标的迭代器的使用,这就是foreach循环的原理。进而,我们再得出两个结论:
1、ArrayList之所以能使用foreach循环遍历,是因为ArrayList所有的List都是Collection的子接口,而Collection是Iterable的子接口,ArrayList的父类AbstractList正确地实现了Iterabl ...