zoukankan      html  css  js  c++  java
  • EffectiveJava(21)策略模式多种方式实现字符串比较

    **调用对象上的方法通常是执行该对象上的某项操作**.
    

    如果一个对象的方法执行其他对象的操作,一个类仅仅导出这个方法(它的实例相当于一个指向该方法的指针),这样的实例被称为函数对象
    例如:
    /**
    * 如果一个类的所有实例在功能上都是相互等价的,那么他应该被设计为一个singleton

    public class StringLengthComparator {
        private StringLengthComparator() {
        }
    
        public static final StringLengthComparator 
            INSTANCE = new StringLengthComparator();
    
        public int compare(String s1, String s2) {
            return s1.length() - s2.length();
        }
    }

    //策略接口

    public interface Comparator<T> {
        public int compare(T s1,T s2);
    }

    /**
    * 如果使用匿名雷胜明,将会在每次执行调用的时候创建一个新的实例.应该讲函数对象储存在一个私有的静态域final里面并重用它
    * @author JacXuan
    *
    */

    public class Host {
    
    //  //使用匿名内部类
    //  Arrays.sort(StringArray,new Comparator<String>(){
    //      public int compare(String s1,String s2){
    //          return s1.length()-s2.length();
    //      }
    //  })
        private static class StrlenCmp implements Comparator<String>,Serializable{
    
            @Override
            public int compare(String s1, String s2) {
                return s1.length()-s2.length();
            }       
        }
        public static final Comparator<String> 
            STRING_LENGTH_COMPARATOR = new StrlenCmp();
    }

    总结:函数指针的只要用途就是实现策略模式.
    在java中实现这种模式,首先要声明一个接口来表示该策略,并且为每个具体策略声明一个实现了该接口的类.当一个具体策略只被调用一次的时候,通常使用匿名类来声明和实例化这个具体的实现类.当一个具体策略是设计用来重复使用的时候,它的类通常就要被实现为私有的静态成员类,并通过公有的静态final域被导出,其类型为该策略接口

  • 相关阅读:
    ubuntu安装gnome桌面,ubuntu系统16升级到18
    重置root密码
    shell中tr的用法
    ubuntu14.04安装zabbix
    TTTTTTTTTTTTTT poj 1127 Jack Straws 线段相交+并查集
    TTTTTTTTTTTTT poj 3057 Evacuation 二分图匹配+bfs
    hdu 1208 Ignatius and the Princess III 划分数,dp
    Poj 3057 未AC http://poj.org/showsource?solution_id=15175171
    poj 3662 Telephone Lines dijkstra+二分搜索
    poj 3684 Physics Experiment 弹性碰撞
  • 原文地址:https://www.cnblogs.com/qwop/p/6637292.html
Copyright © 2011-2022 走看看