您的位置:首页 > 其它

学习设计模式之--------策略模式

2010-01-08 09:17 399 查看
今天利用点空余时间学习了下策略模式,打铁趁热记下自己的理解!这方面的高手可以指点下。

说到为什么用设计模式,自己也不是很明白,只是觉得很有用。主要在代码编写前使用,目的是为了后期的维护,

主要是对比较大的系统,因为系统在投入使用后,必须的根据实际情况进行相应的改动,比如功能的添加什么的。

设计模式至少要遵循3个原则:

我们依赖于抽象策略而不是具体策略 --依赖倒转原则

每一种具体的策略都能取代抽象策略的位置 --里矢代换原则

每当出现新的策略,直接添加,而不需要任何修改 --开闭原则

比较容易理解的策略模式:

策略模式就是 通过继承一个共同的abstract类(基类),该类中定义了每个子类共同的属性和方法,

然后各个子类根据自己的特点选择自己的方法,这里忘了点,子类使用的不同方法是从一个共同的接口里面

implements过来的。说了半天感觉怎么就是说不明白!

这有个实际的例子,先写下来了。比如说现在要设计一个本公司全体员工的工资发放系统。

首先,对所有的员工,当然boss不在其内了,建立一个abstract类personnel

abstract class Personnel

{

protected 很多的属性;

public function getSalary(); //发工资

public function addSalary(); //加工资

public function basicSalary(); //基本工资改变

public function decreaseSaraly(); //减工资

}

这样员工发工资都可以继承这个类了,但好像还有一个问题,那就是假如有一类员工工资有变动,

那就的修改基类了,要是用很多种改变,那不就的一个一个改!,麻烦!因此,高人们又想了个

很好的解决方法,对每个功能(涨工资,减工资等。。。)加个接口,比如涨工资的接口

interface ChangeAddSalary

{

public function addSalary($_basicSalary);

}

员工涨工资都实现这个接口

manager涨工资

class MannageAddSalary implements ChangeAddSalary

{

protected $basicsalary;

protected $addsalary;

public function __construct(){

$this->addsalary = 800;

}

public function addSalary($_basicsalary){

return $this->basicsalary = $_basicsalary;

}

public function getNewSalary(){

return $this->addsalary;

}

}

employee 涨工资

class EmployeeAddSalary implements ChangeAddSalary

{

protected $basicsalary;

protected $addsalary;

public function __construct(){

$this->addsalary = 800;

}

public function addSalary($_basicsalary){

return $this->basicsalary = $_basicsalary;

}

public function getNewSalary(){

return $this->addsalary;

}

}

其余功能类似,忽略不写了,当各类员工所对应的工资改变功能通过继承接口的类实现了后,

现在该考虑重新写基类Personnel了

abstract class Personnel

{

protected $basicsalary;

protected $addsalary;

protected $decreasesalary;

protected $totalsalary;

protected $name;

abstract public function getSalary();

public function addSalary(ChangeAddSalary $_changeaddsalary){

$_changeaddsalary->addSalary($this->basicsalary);

$this->addsalary = $_changeaddsalary->getNewSalary()+$this->addsalary;

}

public function decreaseSalary(ChangeDecreaseSalary $_changedecreasesalary){

$_changedecreasesalary->decreaseSalary($this->basicsalary);

$this->decreasesalary = $_changeaddsalary->getNewSalary()+$this->decreasesalary;

}

public function basicSalary(ChangeBasicSalary $_changebasicsalary){

$_changebasicsalary->basicSalary($this->basicsalary);

$this->basicsalary = $_changebasicsalary->getNewSalary();

}

public function totalSalary(){

$this->totalsalary = $this->basicsalary+$this->addsalary-$this->decreasesalary;

}

}

基类已经完成了,现在的完成各类员工的类Mannage和Employee

class Mannage extends Personnel

{

public function __construct($name);{

$this->name = $name;

$this->basicsalary = 5000;

}

public function getSalary(){

$this->totalSalary();

return $this->totalsalary;

}

public function getName(){

return $this->name;

}

}

class Employee extends Personnel

{

public function __construct($name);{

$this->name = $name;

$this->basicsalary = 2700;

}

public function getSalary(){

$this->totalSalary();

return $this->totalsalary;

}

public function getName(){

return $this->name;

}

}

到这里就是最关键的地方了,怎样才能将各种类型的员工和他们对应的工资发放方法进行动态绑定

写一个操作类User

class User

{

public static function addSalary(Personnel $_personnel){

if($_personnel instanceof Mannage){

$changeaddsalary = new MannageAddSalary();

}else if($_personnel instanceof Employee){

$changeaddsalary = new EmployeeAddSalary();

}else{

echo "不存在该用户组!";

}

$_personnel->addSalary($changeaddsalary);

}

public static function decreaseSalary(Personnel $_personnel){

if($_personnel instanceof Mannage){

$changedecreasesalary = new MannageDecreaseSalary();

}else if($_personnel instanceof Employee){

$changedecreasesalary = new EmployeeDecreaseSalary();

}else{

echo "不存在该用户组!";

}

$_personnel->decreaseSalary($changedecreasesalary);

}

public static function basicSalary(Personnel $_personnel){

if($_personnel instanceof Mannage){

$changebasicsalary = new MannageBasicSalary();

}else if($_personnel instanceof Employee){

$changebasicsalary = new EmployeeBasicSalary();

}else{

echo "不存在该用户组!";

}

$_personnel->basicSalary($changebasicsalary);

}

}

到此,大功告成,只剩下调用了!

$hehe = new Employee("hehe"); //实例化一个叫 hehe 的一般员工

User::addSalary($hehe); //涨工资了O(∩_∩)O~

User::decreaseSalary($hehe); //减工资了~~~~(>_<)~~~~

User::decreaseSalary($hehe); //减工资了~~~~(>_<)~~~~

echo $hehe->getSalary(); //结算工资
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: