农村小学校园网站建设方案,天心区网站建设,深圳公司注册核名官网,湖南省建设厅208号文设计模式最大的作用就是在变化和稳定中间寻找隔离点#xff0c;然后分离它们#xff0c;从而管理变化。将变化像小兔子一样关到笼子里#xff0c;让它在笼子里随便跳#xff0c;而不至于跳出来把你整个房间给污染掉。 设计思想
将行为想象为一族算法#xff0c;定义算法族… 设计模式最大的作用就是在变化和稳定中间寻找隔离点然后分离它们从而管理变化。将变化像小兔子一样关到笼子里让它在笼子里随便跳而不至于跳出来把你整个房间给污染掉。 设计思想
将行为想象为一族算法定义算法族分别封装起来让他们之间可以互相替换使得算法的变化独立于使用算法的客户。
业务场景
假定现在让你设计一个鸭子类模仿这个世界上所有的鸭子你会怎么做
你可能会说使用继承先定义一个Duck父类然后写一些函数display表现鸭子的模样fly表现鸭子的飞行动作quack表现鸭子的叫声…然后再写一些类去继承这个父类一个一个重写父类的函数模仿每种鸭子不同的长相飞行行为和叫声。
如果你是一个初学者你能想出这些并不奇怪问题也确确实实解决了但却并不是最佳方法。这种设计会造成大量的函数重复比如世界上现在有10种鸭子有4种鸭子的模样一模一样另外3种一模一样剩下的一模一样而你却要一个一个去重复写display函数这种设计也并不利于未来的业务发展比如现在你用继承完成了所有的鸭子设计某一天科学家又宣布新发现10种鸭子而你还是要继续改动你的代码不断的重写不断的继承。很快你就会发现继承并不是一个好办法。
刚开始出现继承这种机制的时候很多程序员便很喜欢用这种方法解决问题。因为这很符合我们以往的认知习惯某某人的儿子可以使用父亲手中的资源这种使用似乎“理所应当”很顺其自然的一件事。但是写代码的时候你就会发现继承能做的事情往往组合也能实现并且有时候会比用继承更好。
我们写程序的一个目标叫软件复用如果你的代码里出现很多一模一样的函数显然并不是一份很好的设计。而正如世界一样我们的代码也需要与时俱进否则就会死亡。一份程序在刚写好的时候仅仅是开始后期花在维护改进更新上的时间要远远多于刚开始开发的时间这些就是所谓的“change”正是这些变化才造成了你不断的加班正如前面让你设计鸭子类一样某天新发现10种鸭子而你为了完成设计可能就要被迫加班。
那么应该采取什么样的设计才能有效的抵御变化少加班呢
我们有一个设计原则叫做找出应用中可能需要变化之处把他们独立出来不要和稳定的代码混在一起。
换句话说如果每次新的需求依赖都会使某些方面的代码发生变化那么你就可以确定这部分的代码需要被抽离和其他稳定的代码有所区分。也就是说把会变化的部分取出并封装起来以便以后可以轻易地改动以扩充此部分而不影响其它部分。
这个概念很简单几乎是每个设计模式背后的精神所在。所有的设计模式都提供了一套方法让“系统中的某部分改变不会影响其它部分”。
策略模式代码案例
封装飞行行为
class FlyBehavior
{
public:virtual void fly() 0;
};class FlyWithWings : public FlyBehavior
{
public:void fly(){cout Fly with Wings... endl;}
};class FlyNoway : public FlyBehavior
{
public:void fly(){cout i can not fly... endl;}
};class FlyWithRockets : public FlyBehavior
{
public:void fly(){cout Fly with Rockets... endl;}
};封装叫声行为
class FlyBehavior
{
public:virtual void fly() 0;
};class FlyWithWings : public FlyBehavior
{
public:void fly(){cout Fly with Wings... endl;}
};class FlyNoway : public FlyBehavior
{
public:void fly(){cout i can not fly... endl;}
};class FlyWithRockets : public FlyBehavior
{
public:void fly(){cout Fly with Rockets... endl;}
};duck类委托飞行行为与叫声行为
class Duck
{
public:FlyBehavior* flyBehavior;QuackBehavior* quackBehavior;void speak(){flyBehavior-fly();quackBehavior-quack();}Duck(FlyBehavior* fly, QuackBehavior* quack){this-flyBehavior fly;this-quackBehavior quack;}
};实现具体的鸭子
class Duck1 : public Duck
{
public:Duck1(FlyBehavior* fly, QuackBehavior* quack) : Duck(fly, quack) {}
};