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     }
View Code
  •  策略模式  
   把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口,然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。
   比如定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换,使得算法可独立于使用它的客户而变化。这就是策略模式。
   当一个应用程序需要实现一种特定的服务或者功能,而且该程序有多种实现方式时使用。
   
 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     }
View Code
  DirFilter这个类存在的唯一原因就是调用accept()方法.创建这个类的目的在于把accept()方法提供给list()使用,使list()可以回调accept(),进而以决定 哪些文件包含在列表中。
  因此这种结构也常常被称为回调。因为list()实现了基本功能,而且按照FileNameFilter的形式提供了这个策略,以便完善list()在提供服务时所需的算法。因为ist()接受FilenameFilter对象作为参数,
  这意味着我们可以传递实现了FilenameFilter接口的任何类的对象,用以选择(甚至在运行时)list()方法的行为方式,策略的目的就是提供了代码行为的灵活性.

posted on 2017-03-16 15:54  AlphaGo1号  阅读(289)  评论(0)    收藏  举报

导航