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域被导出,其类型为该策略接口
EffectiveJava(21)策略模式多种方式实现字符串比较的更多相关文章
- [设计模式] 21 策略模式 Strategy
在GOF的<设计模式:可复用面向对象软件的基础>一书中对策略模式是这样说的:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.该模式使得算法可独立于使用它的客户而变化. 策略模 ...
- Java设计模式(十二) 策略模式
原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...
- 重构11-Switch to Strategy(Switch到策略模式)
重构没有固定的形式,多年来我使用过不同的版本,并且我敢打赌不同的人也会有不同的版本. 该重构适用于这样的场景:switch语句块很大,并且会随时引入新的判断条件.这时,最好使用策略模式将每个条件封装到 ...
- 第21章 策略模式(Strategy Pattern)
原文 第21章 策略模式(Strategy Pattern) 策略模式 导读:策略模式看完之后,大多数人都会感觉有点混了,包括我,感觉策略模式是一种OO思想的体现(纯属个人拙见). 概述: ...
- 基于 普通及Lambda方式实现策略模式
什么是策略模式 策略模式代表了解决一类算法的通用解决方案,你可以在运行时选择使用哪种方案.比如如何使用不同的条件(比如苹果的重量,或者颜色 )来筛选库存中的苹果.你可以将这一模式应用到更广泛的领域 , ...
- 设计模式(21)--Strategy(策略模式)--行为型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而 ...
- Spring 实现策略模式--自定义注解方式解耦if...else
策略模式 定义 定义一簇算法类,将每个算法分别封装起来,让他们可以互相替换,策略模式可以使算法的变化独立于使用它们的客户端 场景 使用策略模式,可以避免冗长的if-else 或 switch分支判断 ...
- Java设计模式(18)策略模式(Strategy模式)
Strategy是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类. Stratrgy应用比较广泛,比如,公司经营业务变化图,可能有两种实现方式,一个是线条曲线, ...
- Spring学习总结(一)——Spring实现IoC的多种方式
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法.没有IoC的程序中我们使用面向对象编程对象的创 ...
随机推荐
- Codeforces 934.D A Determined Cleanup
D. A Determined Cleanup time limit per test 1 second memory limit per test 256 megabytes input stand ...
- Download RPM packages from a YUM repo without installing
This how-to will explain how to download rpm packages from a yum repository without installing them. ...
- flexigrid 学习总结
最近看到了一款flexigrid表格组件,简单美观,在下载使用的过程中,发现缺少很多功能.<基于jQuery的GridView-Flexigrid(2)-扩展和修复>给我带来了很大的帮助, ...
- Linux内核中的中断栈与内核栈的补充说明【转】
转自:http://blog.chinaunix.net/uid-12461657-id-3487463.html 原文地址:Linux内核中的中断栈与内核栈的补充说明 作者:MagicBoy2010 ...
- centos7使用tomcat部署javaweb项目
1.下载二进制安装包 tomcat下载地址 2.下载jdk和配置环境变量 这里就不再多描述不清楚,可以 参考 我的yum安装的jdk 3.在centos7下安装 tomcat #切换到/u ...
- 读取EXCEL的办法
private void button9_Click(object sender, EventArgs e) { var folder =new FolderBrowserDialog(); if ( ...
- spring JPA写法一种
第一次用,搞了半天,终于知道了大概. 基于ORM的JPA还是蛮好用的, 这次是实现一个MANGODB的日志存储和检索. PRISM用的. repository的写法: package paic.sto ...
- ASP.NET Code First Update-Database
问题描述: 复制了一个模块化的MVC5的项目,模块化的解释是说不同功能的模块分开来放的. 明确每个模块都是做什么工作的. 首先最基本的,就是根据Apps.Models模块来创建数据库了. 做法是卸载A ...
- 这绝对是有史以来最详细的web前端学习路线
定要善用开发者工具.firefox的firebug和Chrome的F12都是很好的选择,用好了这个必会发现他带给你的帮助比看一本书更多.你把firebug摸透了你还担心对DOM理解不够?考虑到未来,h ...
- Python与数据结构[2] -> 队列/Queue[0] -> 数组队列的 Python 实现
队列 / Queue 数组队列 数组队列是队列基于数组的一种实现,其实现类似于数组栈,是一种FIFO的线性数据结构. Queue: <--| 1 | 2 | 3 | 4 | 5 |<-- ...