编辑“策略模式 ”
跳到导航
跳到搜索
编辑提示 您当前没有登录。 如果您保存任何编辑，您的 IP地址 将 公开记录 在 本页的修订历史 中。您如果 登录 或 注册一个帐号 ，可以隐藏自己的IP地址并 使用更多功能 。您可以在 您的对话页 查看给您的留言。
任何侵权内容 将會删除 | 百科内容須附有來源，以 供查证 | 維基百科內容均容許他人编辑、使用和重制 | 参阅 繁简 和 地区词处理 指引。
反垃圾检查。
不要 加入这个！ 切换编辑器 您已切换至源代码编辑 关闭 您可以随时通过点击该图标切换回可视化编辑。 可视化编辑 源代码编辑 更多 预览 高级 特殊字符 帮助 引用 标题 2级 3级 4级 5级 格式 插入 拉丁字母 扩展拉丁字母 国际音标 符号 希腊字母 希腊字母扩展 西里尔字母 阿拉伯字母 扩展阿拉伯字母 希伯来字母 孟加拉语字符集 泰米尔数字和符号 泰卢固语字符集 僧伽罗语字符集 梵文字符集 古吉拉特语字符集 泰语字符集 老挝语 高棉语字母 加拿大原住民音节文字 卢恩 Á á À à Â â Ä ä Ã ã Ǎ ǎ Ā ā Ă ă Ą ą Å å Ć ć Ĉ ĉ Ç ç Č č Ċ ċ Đ đ Ď ď É é È è Ê ê Ë ë Ě ě Ē ē Ĕ ĕ Ė ė Ę ę Ĝ ĝ Ģ ģ Ğ ğ Ġ ġ Ĥ ĥ Ħ ħ Í í Ì ì Î î Ï ï Ĩ ĩ Ǐ ǐ Ī ī Ĭ ĭ İ ı Į į Ĵ ĵ Ķ ķ Ĺ ĺ Ļ ļ Ľ ľ Ł ł Ń ń Ñ ñ Ņ ņ Ň ň Ó ó Ò ò Ô ô Ö ö Õ õ Ǒ ǒ Ō ō Ŏ ŏ Ǫ ǫ Ő ő Ŕ ŕ Ŗ ŗ Ř ř Ś ś Ŝ ŝ Ş ş Š š Ș ș Ț ț Ť ť Ú ú Ù ù Û û Ü ü Ũ ũ Ů ů Ǔ ǔ Ū ū ǖ ǘ ǚ ǜ Ŭ ŭ Ų ų Ű ű Ŵ ŵ Ý ý Ŷ ŷ Ÿ ÿ Ȳ ȳ Ź ź Ž ž Ż ż Æ æ Ǣ ǣ Ø ø Œ œ ß Ð ð Þ þ Ə ə 格式 链接 标题 列表 文件 参考 讨论 说明 输入内容 输出结果 斜体 ''斜体文字'' 斜体文字 粗体 '''粗体文字''' 粗体文字 粗斜体 '''''粗斜体文字''''' 粗斜体文字 模板 cite web cite news cite book cite journal cite conference cite encyclopedia 同名文献 已命名参考文献 错误检查 检查错误 策略模式作爲一種[[軟件設計模式]]，指對象有某個行爲，但是在不同的場景中，該行爲有不同的實現算法。比如每個人都要“交個人所得稅”，但是“在美國交個人所得稅”和“在中華民國交個人所得稅”就有不同的算稅方法。
策略模式：
*定义了一族算法（业务规则）；
*封装了每个算法；
*这族的算法可互换代替（interchangeable）。
== 结构 ==
[[Image:Strategy_Pattern_in_UML.png|none|thumb|300px|Strategy Pattern in [[UML]] ]]
[[Image:Strategy pattern in LePUS3.gif|thumb|none|300px|Strategy pattern in [[Lepus3|LePUS3]] ([https://web.archive.org/web/20180314162121/http://www.lepus.org.uk/ref/legend/legend.xml legend]) ]]
== 示例 ==
=== [[C++]] ===
<syntaxhighlight lang="cpp">
#include <iostream>
using namespace std;
class StrategyInterface
{
public:
virtual void execute() = 0;
};
class ConcreteStrategyA: public StrategyInterface
{
public:
virtual void execute()
{
cout << "Called ConcreteStrategyA execute method" << endl;
}
};
class ConcreteStrategyB: public StrategyInterface
{
public:
virtual void execute()
{
cout << "Called ConcreteStrategyB execute method" << endl;
}
};
class ConcreteStrategyC: public StrategyInterface
{
public:
virtual void execute()
{
cout << "Called ConcreteStrategyC execute method" << endl;
}
};
class Context
{
private:
StrategyInterface *_strategy;
public:
Context(StrategyInterface *strategy):_strategy(strategy)
{
}
void set_strategy(StrategyInterface *strategy)
{
_strategy = strategy;
}
void execute()
{
_strategy->execute();
}
};
int main(int argc, char *argv[])
{
ConcreteStrategyA concreteStrategyA;
ConcreteStrategyB concreteStrategyB;
ConcreteStrategyC concreteStrategyC;
Context contextA(&concreteStrategyA);
Context contextB(&concreteStrategyB);
Context contextC(&concreteStrategyC);
contextA.execute();
contextB.execute();
contextC.execute();
contextA.set_strategy(&concreteStrategyB);
contextA.execute();
contextA.set_strategy(&concreteStrategyC);
contextA.execute();
return 0;
}
</syntaxhighlight>
=== [[Java]] ===
<syntaxhighlight lang="java">
//StrategyExample test application
class StrategyExample {
public static void main(String[] args) {
Context context;
// Three contexts following different strategies
context = new Context(new FirstStrategy());
context.execute();
context = new Context(new SecondStrategy());
context.execute();
context = new Context(new ThirdStrategy());
context.execute();
}
}
// The classes that implement a concrete strategy should implement this
// The context class uses this to call the concrete strategy
interface Strategy {
void execute();
}
// Implements the algorithm using the strategy interface
class FirstStrategy implements Strategy {
public void execute() {
System.out.println("Called FirstStrategy.execute()");
}
}
class SecondStrategy implements Strategy {
public void execute() {
System.out.println("Called SecondStrategy.execute()");
}
}
class ThirdStrategy implements Strategy {
public void execute() {
System.out.println("Called ThirdStrategy.execute()");
}
}
// Configured with a ConcreteStrategy object and maintains a reference to a Strategy object
class Context {
Strategy strategy;
// Constructor
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void execute() {
this.strategy.execute();
}
}
</syntaxhighlight>
=== [[C♯|C#]] ===
<syntaxhighlight lang="csharp">
using System;
namespace Wikipedia.Patterns.Strategy
{
// MainApp test application
class MainApp
{
static void Main()
{
Context context;
// Three contexts following different strategies
context = new Context(new ConcreteStrategyA());
context.Execute();
context = new Context(new ConcreteStrategyB());
context.Execute();
context = new Context(new ConcreteStrategyC());
context.Execute();
}
}
// The classes that implement a concrete strategy should implement this
// The context class uses this to call the concrete strategy
interface IStrategy
{
void Execute();
}
// Implements the algorithm using the strategy interface
class ConcreteStrategyA : IStrategy
{
public void Execute()
{
Console.WriteLine( "Called ConcreteStrategyA.Execute()" );
}
}
class ConcreteStrategyB : IStrategy
{
public void Execute()
{
Console.WriteLine( "Called ConcreteStrategyB.Execute()" );
}
}
class ConcreteStrategyC : IStrategy
{
public void Execute()
{
Console.WriteLine( "Called ConcreteStrategyC.Execute()" );
}
}
// Configured with a ConcreteStrategy object and maintains a reference to a Strategy object
class Context
{
IStrategy strategy;
// Constructor
public Context(IStrategy strategy)
{
this.strategy = strategy;
}
public void Execute()
{
strategy.Execute();
}
}
}
</syntaxhighlight>
=== ActionScript 3 ===
<syntaxhighlight lang="actionscript">
//invoked from application.initialize
private function init() : void
{
var context:Context;
context = new Context( new ConcreteStrategyA() );
context.execute();
context = new Context( new ConcreteStrategyB() );
context.execute();
context = new Context( new ConcreteStrategyC() );
context.execute();
}
package org.wikipedia.patterns.strategy
{
public interface IStrategy
{
function execute() : void ;
}
}
package org.wikipedia.patterns.strategy
{
public final class ConcreteStrategyA implements IStrategy
{
public function execute():void
{
trace( "ConcreteStrategyA.execute(); invoked" );
}
}
}
package org.wikipedia.patterns.strategy
{
public final class ConcreteStrategyB implements IStrategy
{
public function execute():void
{
trace( "ConcreteStrategyB.execute(); invoked" );
}
}
}
package org.wikipedia.patterns.strategy
{
public final class ConcreteStrategyC implements IStrategy
{
public function execute():void
{
trace( "ConcreteStrategyC.execute(); invoked" );
}
}
}
package org.wikipedia.patterns.strategy
{
public class Context
{
private var strategy:IStrategy;
public function Context(strategy:IStrategy)
{
this.strategy = strategy;
}
public function execute() : void
{
strategy.execute();
}
}
}
</syntaxhighlight>
=== [[PHP]] ===
<syntaxhighlight lang="php">
<?php
class StrategyExample {
public function __construct() {
$context = new Context(new ConcreteStrategyA());
$context->execute();
$context = new Context(new ConcreteStrategyB());
$context->execute();
$context = new Context(new ConcreteStrategyC());
$context->execute();
}
}
interface IStrategy {
public function execute();
}
class ConcreteStrategyA implements IStrategy {
public function execute() {
echo "Called ConcreteStrategyA execute method\n";
}
}
class ConcreteStrategyB implements IStrategy {
public function execute() {
echo "Called ConcreteStrategyB execute method\n";
}
}
class ConcreteStrategyC implements IStrategy {
public function execute() {
echo "Called ConcreteStrategyC execute method\n";
}
}
class Context {
var $strategy;
public function __construct(IStrategy $strategy) {
$this->strategy = $strategy;
}
public function execute() {
$this->strategy->execute();
}
}
new StrategyExample;
?>
</syntaxhighlight>
=== [[Objective-C]] ===
<syntaxhighlight lang="objc">
@protocol Strategy <NSObject>
@required
- (void)print;
@end
@interface ConcreteStrategyA : NSObject<Strategy>
{
}
@end
@interface ConcreteStrategyB : NSObject<Strategy>
{
}
@end
@interface Context : NSObject
{
id<Strategy> _strategy;
}
@property (nonatomic, assign) id<Strategy> strategy;
-(void)doIt;
@end
@implementation ConcreteStrategyA
- (void)print
{
NSLog(@"Test01");
}
@end
@implementation ConcreteStrategyB
- (void)print
{
NSLog(@"Test02");
}
@end
@implementation Context
@synthesize strategy = _strategy;
-(void)doIt
{
[self.strategy print];
}
@end
</syntaxhighlight>
{{软件设计模式}}
[[Category:软件设计模式]]
编辑摘要 （请简要描述您所作出的修改，或选择： 新条目 修饰语句 修正笔误 内容扩充 排版 来源 内部链接 分类 消歧义 维基化 维护清理 ）
点击发布更改 即表示您同意我们的 使用条款 。
同时您同意依據 CC-BY-SA-4.0 和 GFDL协议 授权您的贡献，并在 CC-BY-SA-4.0 的条款下以超链接或URL的方式进行署名。
取消
编辑帮助 （在新窗口中打开）
， 、 。 ？ ！ ； ： · “” ‘’ 「」 『』 （） — —— …… 《》 〈〉 【】
〖〗 〔〕 ～
<>
[[Commons:]]
[[m:]]
[[n:]]
[[q:]]
[[s:]]
[[b:]]
[[Wikt:]] ·
<nowiki></nowiki>
<noinclude></noinclude>
<includeonly></includeonly>
<onlyinclude></onlyinclude>
-{}- {{{}}} ·
{{subst:}}
{{SERVER}}{{localurl:}}
{{fullurl:}}
{{FULLPAGENAME}}
{{PAGENAME}}
{{DEFAULTSORT:}} ·
{{#expr:}}
{{#if:}}
{{#ifeq:}}
{{#ifexpr:}}
{{#switch:}}
{{#ifexist:}}
{{#time:Y年Fj日 H:i|}}
{{#language:}}
~~~
~~~~
~~~~~
ā
á
ǎ
à ·
ō
ó
ǒ
ò ·
ē
é
ě
è ·
ī
í
ǐ
ì ·
ū
ú
ǔ
ù ·
ü
ǖ
ǘ
ǚ
ǜ ·
ê
ê̄
ế
ê̌
ề ·
Ā
Á
Ǎ
À ·
Ō
Ó
Ǒ
Ò ·
Ē
É
Ě
È
ㄅ
ㄆ
ㄇ
ㄈ
ㄉ
ㄊ
ㄋ
ㄌ
ㄍ
ㄎ
ㄏ
ㄐ
ㄑ
ㄒ
ㄓ
ㄔ
ㄕ
ㄖ
ㄗ
ㄘ
ㄙ
ㄧ
ㄨ
ㄩ
ㄚ
ㄛ
ㄜ
ㄝ
ㄞ
ㄟ
ㄠ
ㄡ
ㄢ
ㄣ
ㄤ
ㄥ
ㄦ ·
ˉ
ˊ
ˇ
ˋ
˙
−
°
℃
℉
‰
￥
¥
€
£
¤
￠
©
®
™
№ ·
→
↑
←
↓
↖
↗
↘
↙
①
②
③
④
⑤
⑥
⑦
⑧
⑨
⑩
⑪
⑫
⑬
⑭
⑮
⑯
⑰
⑱
⑲
⑳ ·
㈠
㈡
㈢
㈣
㈤
㈥
㈦
㈧
㈨
㈩ ·
〇
〡
〢
〣
〤
〥
〦
〧
〨
〩
Ⅰ
Ⅱ
Ⅲ
Ⅳ
Ⅴ
Ⅵ
Ⅶ
Ⅷ
Ⅸ
Ⅹ
Ⅺ
Ⅻ
Ⅼ
Ⅽ
Ⅾ
Ⅿ
⒈
⒉
⒊
⒋
⒌
⒍
⒎
⒏
⒐
⒑
⒒
⒓
⒔
⒕
⒖
⒗
⒘
⒙
⒚
⒛ ·
⑴
⑵
⑶
⑷
⑸
⑹
⑺
⑻
⑼
⑽
⑾
⑿
⒀
⒁
⒂
⒃
⒄
⒅
⒆
⒇
≠
≤
≥
<
>
≡
≈
≅
∝
°
′
″
∴
∵ ·
−
×
÷
±
⊥
⊕
⊗
∗ ·
…
¼
½
¾
¹
²
³
° ·
∂
∫
∑
∞
∏
√
∇ ·
←
→
↔
⇐
⇒
⇔ ·
⌈
⌉
⌊
⌋ ·
¬
∧
∨
∃
∀ ·
∈
∉
∋
∅
⊆
⊇
⊃
⊂
⊄
∪
∩
ℵ
<math></math>
簡單: ^{} · _{} · \sqrt[]{} · \frac{}{} · \int_{}^{} · \lim_{\rightarrow} · \sum_{=}^{}
標準功能: \sin{}
\cos{}
\tan{} ·
\cot{}
\sec{}
\csc{} ·
\exp{}
\ln{}
\log{} ·
\sinh{}
\cosh{}
\tanh{}
\coth{} ·
\arcsin{}
\arccos{}
\arctan{}
Diactritiques : \acute{}
\breve{}
\check{}
\grave{}
\tilde{}
数学公式帮助
あ
い
う
え
お ·
か
き
く
け
こ ·
さ
し
す
せ
そ ·
た
ち
つ
て
と ·
な
に
ぬ
ね
の ·
は
ひ
ふ
へ
ほ ·
ま
み
む
め
も ·
や
ゆ
よ ·
ら
り
る
れ
ろ ·
わ
ゐ
ゑ
を ·
ん
ア
イ
ウ
エ
オ ·
カ
キ
ク
ケ
コ ·
サ
シ
ス
セ
ソ ·
タ
チ
ツ
テ
ト ·
ナ
ニ
ヌ
ネ
ノ ·
ハ
ヒ
フ
ヘ
ホ ·
マ
ミ
ム
メ
モ ·
ヤ
ユ
ヨ ·
ラ
リ
ル
レ
ロ ·
ワ
ヰ
ヱ
ヲ ·
ン
在此页面使用的维基数据实体
策略模式 ：​网站链接、​描述：zh
本页 使用 了15个模板：
Template:En-link （ 查看源代码 ）（模板保护） Template:Internal link helper/en （ 查看源代码 ）（ 全保护 ） Template:Le （ 查看源代码 ）（ 全保护 ） Template:Navbox （ 查看源代码 ）（ 全保护 ） Template:Navbox subgroup （ 查看源代码 ）（模板保护） Template:Translink （ 查看源代码 ）（ 全保护 ） Template:Tsl （ 查看源代码 ）（ 全保护 ） Template:软件设计模式 （ 编辑 ） Module:Arguments （ 查看源代码 ）（ 全保护 ） Module:Ilh （ 查看源代码 ）（ 全保护 ） Module:Ilh/data （ 查看源代码 ）（ 全保护 ） Module:Lan （ 查看源代码 ）（ 全保护 ） Module:Navbar （ 查看源代码 ）（ 全保护 ） Module:Navbox （ 查看源代码 ）（ 全保护 ） Module:Yesno （ 查看源代码 ）（ 全保护 ）
取自“ https://zh.wikipedia.org/wiki/策略模式 ”
导航菜单
个人工具
没有登录 讨论 贡献 创建账号 登录
命名空间
条目 讨论
不转换
不转换 简体 繁體 大陆简体 香港繁體 澳門繁體 大马简体 新加坡简体 臺灣正體
查看
阅读 编辑源代码 查看历史
更多
导航
首页 分类索引 特色内容 新闻动态 最近更改 随机条目 资助维基百科
帮助
帮助 维基社群 方针与指引 互助客栈 知识问答 字词转换 IRC即时聊天 联络我们 关于维基百科
工具
链入页面 相关更改 上传文件 特殊页面 页面信息 维基数据项目 短链接
语言
隐私政策
关于维基百科
免责声明
手机版视图
开发者
统计
Cookie声明
编辑预览设置
发生了一些错误 关闭 欢迎来到Wikipedia 人人皆可编辑，并且任何改进都有帮助。
感谢您帮助世界发现更多！ 切换为可视化编辑器 开始编辑