以前写的一个Design Pattern的文章
Design Pattern Practice
1.序
本文从一个简单的多列排序的例子入手,由浅入深地讲解Design Pattern(设计模式)的目的、分析和实践。
文中的例子用到Compositor Pattern和Proxy Pattern。
同时,文中的例子也提供了一类问题(条件组合问题)的解决方案。
2.问题的引入
Design Pattern(设计模式)的目标是,把共通问题中的不变部分和变化部分分离出来。不变的部分,就构成了Design Pattern(设计模式)。这一点和Framework(框架)有些象。
下面举个排序的例子,说明如何抽取问题中的不变部分。
假设一个Java类Record有field1,field2,field3等字段。
public class Record{public int field1;public long field2;public double filed3;};void sort(Record[] records){for(int i =….){for(int j=….){if(records[i].field1 > records[j].field1)// swap records[i] and records[j]}}}void sort(Record[] records){for(int i =….){for(int j=….){if(records[i].field2 > records[j].field2)// swap records[i] and records[j]}}}public interface Comparator(){public boolean greaterThan(Record a, Record b);};sort函数就可以这样写(把判断条件作为参数):void sort(Record[] records, Comparator compare){for(int i =….){for(int j=….){if(compare.greaterThen(records[i], records[j]))// swap records[i] and records[j]}}}public class CompareByField1 implements Comparator{public boolean greaterThan(Record a, Record b){if(a.filed1 > b.filed1){return ture;}return false;}}public class CompareByField2 implements Comparator{public boolean greaterThan(Record a, Record b){if(a.filed2 > b.filed2){return ture;}return false;}}import java.util.Comparator;public class ReverseComparator implements Comparator{ /** the original comparator*/ private Comparator originalComparator = null; /** constructor takes a comparator as parameter */ public ReverseComparator(Comparator comparator){ originalComparator = comparator; } /** reverse the result of the original comparator */ public int compare(Object o1, Object o2){ return - originalComparator.compare(o1, o2); }}import java.util.Comparator;import java.util.Iterator;import java.util.List;import java.util.LinkedList;public class CompositeComparator implements Comparator{ /** in the condition list, comparators' priority decrease from head to tail */ private List comparators = new LinkedList(); /** get the comparators, you can manipulate it as need.*/ public List getComparators(){ return comparators; } /** add a batch of comparators to the condition list */ public void addComparators(Comparator[] comparatorArray){ if(comparatorArray == null){ return; } for(int i = 0; i < comparatorArray.length; i++){ comparators.add(comparatorArray[i]); } } /** compare by the priority */ public int compare(Object o1, Object o2){ for(Iterator iterator = comparators.iterator(); iterator.hasNext();){ Comparator comparator = (Comparator)iterator.next(); int result = comparator.compare(o1, o2); if(result != 0){ return result; } } return 0; }} CompoiComparator myComparator = new CompoiComparator(); myComparator. addComparators(new Comparator[]{new Field1Comaprator (), new Field2Comaprator ()};);// records is a list of Record Collections.sort(records, myComparator); CompoiComparator myComparator = new CompoiComparator(); myComparator. addComparators(new Comparator[]{new ReverseComparator(new Field1Comaprator ()), new Field2Comaprator ()};);// records is a list of Record Collections.sort(records, myComparator);import java.io.FileFilter;import java.io.File;import java.util.Iterator;import java.util.List;import java.util.LinkedList;public class CompositeFilter implements FileFilter { /** in the filter list, every condition should be met. */ private List filters = new LinkedList(); /** get the filters, you can manipulate it as need.*/ public List getFilters(){ return filters; } /** add a batch of filters to the condition list */ public void addFilters(FileFilter[] filterArray){ if(filterArray == null){ return; } for(int i = 0; i < filterArray.length; i++){ filters.add(filterArray[i]); } } /** must meet all the filter condition */ public boolean accept(File pathname) { for(Iterator iterator = filters.iterator(); iterator.hasNext();){ FileFilter filter = (FileFilter)iterator.next(); boolean result = filter.accept(pathname); // if any condition can not be met, return false. if(result == false){ return false; } } // all conditions are met, return true. return true; }}import java.io.FileFilter;import java.io.File;public class ReverseFilter implements FileFilter { /** the original filter*/ private FileFilter originalFilter = null; /** constructor takes a filter as parameter */ public ReverseFilter(FileFilter filter){ originalFilter = filter; } /** must meet all the filter condition */ public boolean accept(File pathname) { return !originalFilter.accept(pathname); }}