https://blog.youkuaiyun.com/huachao1001/article/details/51536074
6 策略模式
定义:有一系列的算法,将每个算法封装起来(每个算法可以封装到不同的类中),各个算法之间可以替换,策略模式让算法独立于使用它的客户而独立变化。
举个例子来理解吧,比如,你现在又很多排序算法:冒泡、希尔、归并、选择等等。我们要根据实际情况来选择使用哪种算法,有一种常见的方法是,通过if…else或者case…等条件判断语句来选择。但是这个类的维护成本会变高,维护时也容易发生错误。
如何使用策略模式呢,我不打算写示例代码了,简单描述一下,就将前面说的算法选择进行描述。我们可以定义一个算法抽象类AbstractAlgorithm,这个类定义一个抽象方法sort()。每个具体的排序算法去继承AbstractAlgorithm类并重写sort()实现排序。在需要使用排序的类Client类中,添加一个setAlgorithm(AbstractAlgorithm al);方法将算法设置进去,每次Client需要排序而是就调用al.sort()。
不知道简单描述能不能让你理解~
看看Android中哪里出现了策略模式,其中在属性动画中使用时间插值器的时候就用到了。在使用动画时,你可以选择线性插值器LinearInterpolator、加速减速插值器AccelerateDecelerateInterpolator、减速插值器DecelerateInterpolator以及自定义的插值器。这些插值器都是实现根据时间流逝的百分比来计算出当前属性值改变的百分比。通过根据需要选择不同的插值器,实现不同的动画效果。这些比较好理解,就不去粘贴Android源码了。
7 状态模式
状态模式中,行为是由状态来决定的,不同状态下有不同行为。状态模式和策略模式的结构几乎是一模一样的,主要是他们表达的目的和本质是不同。状态模式的行为是平行的、不可替换的,策略模式的行为是彼此独立可相互替换的。
举个例子把,比如电视,电视有2个状态,一个是开机,一个是关机,开机时可以切换频道,关机时切换频道不做任何响应。
<?php
interface TvState{
public function nextChannel();
public function prevChannel();
public function turnUp();
public function turnDown();
}
class PowerOffState implements TvState{
public function nextChannel(){}
public function prevChannel(){}
public function turnUp(){}
public function turnDown(){}
}
class PowerOnState implements TvState{
public function nextChannel(){
echo "下一频道";
}
public function prevChannel(){
echo "上一频道";
}
public function turnUp(){
echo "调高音量";
}
public function turnDown(){
echo "调低音量";
}
}
interface PowerController{
public function powerOn();
public function powerOff();
}
class TvController implements PowerController{
public $mTvState;
public function setTvState(TvState $tvState){
$this->mTvState=$tvState;
}
public function powerOn(){
$this->setTvState(new PowerOnState());
echo "开机啦";
}
public function powerOff(){
$this->setTvState(new PowerOffState());
echo "关机啦";
}
public function nextChannel(){
$this->mTvState->nextChannel();
}
public function prevChannel(){
$this->mTvState->prevChannel();
}
public function turnUp(){
$this->mTvState->turnUp();
}
public function turnDown(){
$this->mTvState->turnDown();
}
}
class Client{
public function main(){
$tvController=new TvController();
$tvController->powerOn();
$tvController->nextChannel();
$tvController->turnUp();
$tvController->powerOff();
//调高音量,此时不会生效
$tvController->turnUp();
}
}
$aa=new Client();
$aa->main();