设计模式系列--Strategy

本文探讨了策略模式的应用,并通过实例展示了其在比较器(Comparator)中的具体应用,简化了对象之间的比较过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.类图

 

二.意图

定义一系列的算法,把它们一个个封装起来并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

三.适用性

a) 许多相关的类仅仅是行为有异。策略提供了一种用多个行为中的一个行为来配置一个类的方法。

b) 需要使用一个算法的不同变体。例如,你可能会定义一些反映不同的空间/时间权衡的算法。当这些变体实现为一个算法的类层次时[ H O 8 7 ] ,可以使用策略模式。

c) 算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。

d) 一个类定义了多种行为并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的S t r a t e g y 类中以代替这些条件语句。

四.实例

诸葛亮的锦囊妙计:

第一条:让赵云一行先去访问乔国老。乔国老是周瑜和孙策的丈人,在东吴有一定的威望,而且和吴国太关系不错。访乔国老一来可以把孙刘联姻之事告诉吴国太(吴国太此前并不知道),让孙权周瑜陷于被动。二来可以让他在吴国太面前美言,增加孙刘联姻的可能性。

第二条:骗说曹操为报赤壁之仇,举兵南下,让刘备速回荆州。刘备在东吴整天花天酒地,乐不思蜀,这是周瑜设计想让刘备玩物丧志。

第三条:用孙夫人来挡追兵。孙尚香好歹也是东吴郡主,她的话,东吴的将领还是得掂量掂量的。

package explore.strategy;

public interface Strategy {
public void perform();
}

package explore.strategy;

public class Context {
private Strategy strategy;

public Context(Strategy strategy) {
this.strategy = strategy;
}

public void setStrategy(Strategy s) {
this.strategy = s;
}

public void perform() {
this.strategy.perform();
}
}

package explore.strategy;

public class TheFirstStrategy implements Strategy {

@Override
public void perform() {
System.out.println("让赵云一行先去访问乔国老。");
}

}

package explore.strategy;

public class TheSecondStrategy implements Strategy {
@Override
public void perform() {
System.out.println("骗说曹操为报赤壁之仇,举兵南下,让刘备速回荆州。");
}

}

package explore.strategy;

public class TheThirdStrategy implements Strategy {
@Override
public void perform() {
System.out.println("用孙夫人来挡追兵。");
}

}

package explore.strategy;

public class ZhaoYun {
public static void main(String[] args) {
//第一条:让赵云一行先去访问乔国老。
Strategy first = new TheFirstStrategy();
//第二条:骗说曹操为报赤壁之仇,举兵南下,让刘备速回荆州。
Strategy second = new TheSecondStrategy();
//第三条:用孙夫人来挡追兵。
Strategy third = new TheThirdStrategy();

Context c = new Context(first);
c.perform();
c.setStrategy(second);
c.perform();
c.setStrategy(third);
c.perform();
}
}

五.Strategy模式在比较器(Comparator)里的应用

 

//比较器
public interface Comparator<T> {
int compare(T o1, T o2);
... ...

//自定义比较算法
public interface Comparable<T> {
public int compareTo(T o);

//Integer自定义的比较算法
public final class Integer extends Number implements Comparable<Integer> {
public int compareTo(Integer anotherInteger) {
int thisVal = this.value;
int anotherVal = anotherInteger.value;
return (thisVal<anotherVal ? -1 : (thisVal==anotherVal ? 0 : 1));
}
... ...

//String类中定义的比较算法
public int compareTo(String anotherString) {
int len1 = count;
int len2 = anotherString.count;
int n = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;

if (i == j) {
int k = i;
int lim = n + i;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
} else {
while (n-- != 0) {
char c1 = v1[i++];
char c2 = v2[j++];
if (c1 != c2) {
return c1 - c2;
}
}
}
return len1 - len2;
}

 

当我们比较两个对象的时候只需调用一个compare()方法就可以了:

int cmp = comparator.compare(obj1, obj2);







转载于:https://www.cnblogs.com/focusj/archive/2012/03/19/2406345.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值