class Program {
public $symbol;
public $num1;
public $num2;
public function __construct($symbol, $num1, $num2) {
$this->symbol = $symbol;
$this->num1 = $num1;
$this->num2 = $num2;
}
public function calculate() {
switch ($this->symbol) {
case '+':
$result = $this->num1 + $this->num2;
break;
case '-':
$result = $this->num1 - $this->num2;
break;
case '*':
$result = $this->num1 * $this->num2;
break;
case '/':
if ($this->num2 != 0) {
$result = $this->num1 / $this->num2;
} else {
$result = "除数不能为0";
}
break;
default:
$result = "运算符错误";
}
return $result;
}
}
$program = new Program('+', 1, 14);
$result = $program->calculate();
print_r($result);//15
复制代码
在上面的代码中存在的缺点: 紧耦合,不易扩展,若是新增了一个平方根运算,却须要让加减乘除都来参与编译,若是一不当心把加法运算改为了减法,那就麻烦了。php
将加减乘除解耦,每个运算用单独的类去写,再用工厂模式实例化出合适的对象,经过多态返回计算器结果,后面若是再加一个平方根运算能够新增一个平方根的类,若是须要修改加法运算,那就只须要修改OperationAdd类。this
class Operation {
public $num1;
public $num2;
}
class OperationAdd extends Operation {
public function getResult() {
$result = $this->num1 + $this->num2;
return $result;
}
}
class OperationSub extends Operation {
public function getResult() {
$result = $this->num1 - $this->num2;
return $result;
}
}
class OperationMul extends Operation {
public function getResult() {
$result = $this->num1 * $this->num2;
return $result;
}
}
class OperationDiv extends Operation {
public function getResult() {
if ($this->num2 != 0) {
$result = $this->num1 / $this->num2;
} else {
$result = "除数不能为0";
}
return $result;
}
}
class OperationFactory {
public static function createOperate($symbol) {
switch ($symbol) {//多态
case '+':
$result = new OperationAdd();
break;
case '-':
$result = new OperationSub();
break;
case '*':
$result = new OperationMul();
break;
case '/':
$result = new OperationDiv();
break;
default:
$result = NULL;
}
return $result;
}
}
$operationFactory = OperationFactory::createOperate('+');
$operationFactory->num1 = 21;
$operationFactory->num2 = 11;
echo $operationFactory->getResult();//32
复制代码