最近又開始學習java的設(shè)計模式话肖,實際上應(yīng)該不是又開始,而是以前學習的不夠葡幸,現(xiàn)在準備深刻的學習一下最筒,以便在工作中能駕輕就熟的運用設(shè)計模式解決實際的問題。
關(guān)于設(shè)計模式的文章很多蔚叨,我主要是從github的一個設(shè)計模式的例子項目研究的是钥,該項目的地址是:https://github.com/iluwatar/java-design-patterns.git掠归。
我很想知道設(shè)計模式在工作中怎么應(yīng)用,所以我會偏重在現(xiàn)實中找例子學習設(shè)計模式悄泥,尤其是jdk中的源碼虏冻。
先從簡單的開始吧。
裝飾模式-decorator弹囚,該項目中提到在現(xiàn)實世界中運用該設(shè)計模式的例子是
Collections#synchronizedXXX() Collections#unmodifiableXXX() Collections#checkedXXX()
以unmodifiableCollection(Collection c)為例厨相,該static方法很簡單:
public static <T> Collection<T> unmodifiableCollection(Collection<? extends T> c) {
return new UnmodifiableCollection<>(c);
}
該方法返回了一個實例化的內(nèi)部靜態(tài)類。恕我孤陋寡聞鸥鹉,我一看到靜態(tài)類蛮穿,就以為是不能實例化,然后就上網(wǎng)搜索了一下java中的內(nèi)部靜態(tài)類的用法毁渗。該文章很好的解釋了靜態(tài)內(nèi)部類的使用方法:http://blog.csdn.net/vange/article/details/5407625
在研究的過程中我還發(fā)現(xiàn)builder模式用到了內(nèi)部靜態(tài)類践磅。
接著說,UnmodifiableCollection該類的代碼如下:
static class UnmodifiableCollection<E> implements Collection<E>, Serializable {
private static final long serialVersionUID = 1820017752578914078L;
final Collection<? extends E> c;
UnmodifiableCollection(Collection<? extends E> c) {
if (c==null)
throw new NullPointerException();
this.c = c;
}
public int size() {return c.size();}
public boolean isEmpty() {return c.isEmpty();}
public boolean contains(Object o) {return c.contains(o);}
public Object[] toArray() {return c.toArray();}
public <T> T[] toArray(T[] a) {return c.toArray(a);}
public String toString() {return c.toString();}
public Iterator<E> iterator() {
return new Iterator<E>() {
private final Iterator<? extends E> i = c.iterator();
public boolean hasNext() {return i.hasNext();}
public E next() {return i.next();}
public void remove() {
throw new UnsupportedOperationException();
}
};
}
public boolean add(E e) {
throw new UnsupportedOperationException();
}
public boolean remove(Object o) {
throw new UnsupportedOperationException();
}
public boolean containsAll(Collection<?> coll) {
return c.containsAll(coll);
}
public boolean addAll(Collection<? extends E> coll) {
throw new UnsupportedOperationException();
}
public boolean removeAll(Collection<?> coll) {
throw new UnsupportedOperationException();
}
public boolean retainAll(Collection<?> coll) {
throw new UnsupportedOperationException();
}
public void clear() {
throw new UnsupportedOperationException();
}
}
對于所有的增刪操作都會拋出UnsupportedOperationException
異常灸异,而對于讀取操作府适,只是調(diào)用了原來的Collection類的方法。這樣就實現(xiàn)了Collection不能修改的功能肺樟。
在Collections.synchronizedCollection(Collection c)也是差不多的實現(xiàn)檐春,在內(nèi)部靜態(tài)類SynchronizedCollection中有一個fieldObject mutex
做為互斥鎖,對于Collection
所有的操作都做了以下修改:
public int size() {
synchronized (mutex) {return c.size();}
}
http://www.cnblogs.com/cangqiongbingchen/p/5806757.html
該文章對synchroized的使用有簡單的介紹么伯,該文章的的第三條需要注意疟暖。
SynchronizedCollection中的方法使用的是類實例鎖,當mutex=this的時候田柔,synchroized的方法之間都是同步的俐巴。通過java語法上的加鎖機制實現(xiàn)了Collection的同步,實現(xiàn)該功能的模式就是裝飾模式硬爆。