java编程思想中的设计模式
- 动态代理模式
在任何时刻,只要你想将额外的操作分离到不同的地方,特别是希望额外的操作不影响原来的操作方法时,代理模式就显得非常有用
- 适配器模式
demo
产生适配foreach的反向迭代器Iterator:
1 /** 2 * @author Ldl 3 * @since 1.0.0 4 */ 5 public class Adapter { 6 7 class ReversibleArrayList<T> extends ArrayList<T> { 8 protected ReversibleArrayList(Collection<T> c) { 9 super(c); 10 } 11 12 protected Iterable<T> reversed() { 13 return new Iterable<T>() { 14 15 @Override 16 public Iterator<T> iterator() { 17 return new Iterator<T>() { 18 int current = size() - 1; 19 20 public boolean hasNext() { 21 return current > -1; 22 } 23 24 public T next() { 25 return get(current--); 26 } 27 28 public void remove() { 29 try { 30 throw new Exception("不支持的操作"); 31 } catch (Exception e) { 32 // TODO Auto-generated catch block 33 e.printStackTrace(); 34 } 35 } 36 }; 37 } 38 39 }; 40 } 41 } 42 43 44 45 46 47 /** 48 * Adapter.main() 49 * @Author Ldl 50 * @Date 2017年3月16日 51 * @since 1.0.0 52 * @param args 53 */ 54 public static void main(String[] args) { 55 Adapter a = new Adapter(); 56 Adapter.ReversibleArrayList<String> ral = new Adapter().new ReversibleArrayList<>( 57 Arrays.asList("To be or not to be".split(" "))); 58 59 for (String fs : ral) { 60 System.out.println(fs + "-- "); 61 } 62 63 for (String bs : ral.reversed()) { 64 System.out.println(bs + "-- "); 65 } 66 67 }
- 策略模式
把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口,然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。
比如定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换,使得算法可独立于使用它的客户而变化。这就是策略模式。
当一个应用程序需要实现一种特定的服务或者功能,而且该程序有多种实现方式时使用。
1 /** 2 * @author Ldl 3 * @since 1.0.0 4 */ 5 public class DirFilter implements FilenameFilter { 6 7 private Pattern pattern; 8 9 /** 10 * 构造函数 11 */ 12 public DirFilter(String regex) { 13 pattern = Pattern.compile(regex); 14 } 15 16 /** 17 * @Author Ldl 18 * @Date 2017年3月28日 19 * @since 1.0.0 20 * @param dir 21 * @param name 22 * @return 23 * @see java.io.FilenameFilter#accept(java.io.File, java.lang.String) 24 */ 25 @Override 26 public boolean accept(File dir, String name) { 27 return pattern.matcher(name).matches(); 28 } 29 30 } 31 32 33 public static void main(String[] args) { 34 File path = new File("."); 35 String[] list; 36 if (args.length == 0) { 37 list = path.list(); 38 } else { 39 list = path.list(new DirFilter(args[0])); 40 } 41 Arrays.sort(list, String.CASE_INSENSITIVE_ORDER); 42 for (String dirItem : list) { 43 System.out.println(dirItem); 44 } 45 46 }
因此这种结构也常常被称为回调。因为list()实现了基本功能,而且按照FileNameFilter的形式提供了这个策略,以便完善list()在提供服务时所需的算法。因为ist()接受FilenameFilter对象作为参数,
这意味着我们可以传递实现了FilenameFilter接口的任何类的对象,用以选择(甚至在运行时)list()方法的行为方式,策略的目的就是提供了代码行为的灵活性.
浙公网安备 33010602011771号