php 23种设计模型 - 策略模式
2024-09-07 19:47:58
介绍
意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换,用户还不需要知道其具体的实现
主要解决:在有多种算法相似的情况下,使用 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
最新文章
- sql 函数 汉字转拼音
- SOLID原则
- 【转】】Android ADB命令大全
- mysql中You can’t specify target table for update in FROM clause错误解决方法
- angularjs探秘<;一>;
- 线程高级应用-心得4-java5线程并发库介绍,及新技术案例分析
- Intent相关
- 彻底理解position与anchorPoint - Wonderffee&#39;s Blog(转)
- Unity 截取图片并且显示出来
- template of class
- Flex读取txt文件里的内容(二)
- Redis 小白指南(二)- 基础命令和五大类型:字符串、散列、列表、集合和有序集合
- 为什么eclipse修改程序之后运行的时候还是前一版本的内容?
- PCA主成份分析
- 使用JavaScript 操作本地文件
- 银行卡号、电话号、身份证号 EditText 自定义格式的输入框
- python实现链表(一)
- 异常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
- pxc 集群节点被kill -9 了拿什么拯救?
- LeetCode--042--接雨水(java版)