介绍

意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换,用户还不需要知道其具体的实现

主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。

何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。

如何解决:将这些算法封装成一个一个的类,任意地替换。

关键代码:实现同一个接口。

应用实例: 1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。 3、JAVA AWT 中的 LayoutManager。

优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。

缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。

使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。

/**
* 策略模式
*/
interface Strategy { // 抽象策略角色,以接口实现
public function do_method(); // 算法接口
} class ConcreteStrategyA implements Strategy { // 具体策略角色A
public function do_method() {
echo 'do method A';
}
} class ConcreteStrategyB implements Strategy { // 具体策略角色B
public function do_method() {
echo 'do method B';
}
} class ConcreteStrategyC implements Strategy { // 具体策略角色C
public function do_method() {
echo 'do method C';
}
} class Question{ // 环境角色
private $_strategy; public function __construct(Strategy $strategy) {
$this->_strategy = $strategy;
}
public function handle_question() {
$this->_strategy->do_method();
}
} // client
$strategyA = new ConcreteStrategyA();
$question = new Question($strategyA);
$question->handle_question();//输出do method A $strategyB = new ConcreteStrategyB();
$question = new Question($strategyB);
$question->handle_question();//输出do method B $strategyC = new ConcreteStrategyC();
$question = new Question($strategyC);
$question->handle_question();//输出do method C

  

23模式总览 : https://www.cnblogs.com/houss/p/11121584.html

最新文章

  1. sql 函数 汉字转拼音
  2. SOLID原则
  3. 【转】】Android ADB命令大全
  4. mysql中You can’t specify target table for update in FROM clause错误解决方法
  5. angularjs探秘<一>
  6. 线程高级应用-心得4-java5线程并发库介绍,及新技术案例分析
  7. Intent相关
  8. 彻底理解position与anchorPoint - Wonderffee's Blog(转)
  9. Unity 截取图片并且显示出来
  10. template of class
  11. Flex读取txt文件里的内容(二)
  12. Redis 小白指南(二)- 基础命令和五大类型:字符串、散列、列表、集合和有序集合
  13. 为什么eclipse修改程序之后运行的时候还是前一版本的内容?
  14. PCA主成份分析
  15. 使用JavaScript 操作本地文件
  16. 银行卡号、电话号、身份证号 EditText 自定义格式的输入框
  17. python实现链表(一)
  18. 异常HTTP Status 500 - Illegal access to constructor, is it public? java.lang.IllegalAccessException: Class com.opensymphony.xwork2.ObjectFactory can not access a member of class action.CoreAction with
  19. pxc 集群节点被kill -9 了拿什么拯救?
  20. LeetCode--042--接雨水(java版)

热门文章

  1. html5 新增标签和特性
  2. Java反射使用方法
  3. 简单实现UITableView索引功能(中英文首字母索引) (二) By HL
  4. ASP.NET Core 6框架揭秘实例演示[04]:自定义依赖注入框架
  5. Solution -「CF 908G」New Year and Original Order
  6. 羽夏闲谈—— C 语言入门之问
  7. Https原理与演变
  8. react 也就这么回事 02 —— JSX 插值表达式、条件渲染以及列表渲染
  9. IDEA配置scala
  10. Spark学习记录