庄生晓梦

庄生晓梦迷蝴蝶

博客园 首页 新随笔 联系 订阅 管理
  164 随笔 :: 3 文章 :: 1 评论 :: 74038 阅读
**调用对象上的方法通常是执行该对象上的某项操作**.

如果一个对象的方法执行其他对象的操作,一个类仅仅导出这个方法(它的实例相当于一个指向该方法的指针),这样的实例被称为函数对象
例如:
/**
* 如果一个类的所有实例在功能上都是相互等价的,那么他应该被设计为一个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域被导出,其类型为该策略接口

posted on   qwop  阅读(201)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示