文档章节

设计模式系列--Strategy

rakshasa
 rakshasa
发布于 2014/12/27 15:53
字数 885
阅读 7
收藏 0

一.类图

 

二.意图

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

三.适用性

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);







本文转载自:http://www.cnblogs.com/focusj/archive/2012/03/19/2406345.html

rakshasa
粉丝 34
博文 142
码字总数 16820
作品 0
昆明
高级程序员
私信 提问
(目录)设计模式(可复用面向对象软件的基础)

本系列“设计模式”博客使用Golang语言实现算法。所谓算法是指解决一个问题的步骤,个人觉得不在于语言。小弟只是最近学习Golang,所以顺带熟练一下语法知识,别无它意。 本系列博客主要介绍...

chapin
2015/01/13
158
0
设计模式-Strategy Pattern

一、 策略(Strategy)模式 策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化...

Start-up
2012/05/17
55
0
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
2018/11/06
185
0
策略模式-javascript

一个基于策略模式的程序至少由两部分组成。 第一个部分是一组策略类,策略类封装了具体的算法,并负责具体的计算过程。第二个部分是环境类Context,Context接受客户的请求,随后把请求委托给...

wee911
09/29
0
0
Javascript策略模式理解以及应用

最近一直在看Javascript设计模式,想通过写文章来增加自己对策略模式的理解,同时记录自己学习的经历。希望大家看完之后觉得有收获可以帮忙点个赞表示支持。 策略模式的定义 策略模式的定义是...

arzh
2018/12/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

3_数组

3_数组

行者终成事
今天
7
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0
使用logstash同步MySQL数据到ES

概述   在生成业务常有将MySQL数据同步到ES的需求,如果需要很高的定制化,往往需要开发同步程序用于处理数据。但没有特殊业务需求,官方提供的logstash就很有优势了。   在使用logstas...

zxiaofan666
今天
10
0
X-MSG-IM-分布式信令跟踪能力

经过一周多的鏖战, X-MSG-IM的分布式信令跟踪能力已基本具备, 特点是: 实时. 只有要RX/TX就会实时产生信令跟踪事件, 先入kafka, 再入influxdb待查. 同时提供实时sub/pub接口. 完备. 可以完整...

dev5
今天
7
0
OpenJDK之CyclicBarrier

OpenJDK8,本人看的是openJDK。以前就看过,只是经常忘记,所以记录下 图1 CyclicBarrier是Doug Lea在JDK1.5中引入的,作用就不详细描述了,主要有如下俩个方法使用: await()方法,如果当前线...

克虏伯
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部