zoukankan      html  css  js  c++  java
  • Head First-策略模式

    策略模式,什么是策略模式,定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。

    下面我们就用鸭子来诠释一下策略模式,鸭子有两种行为呱呱叫和飞,但是并不是所有的鸭子都会呱呱叫和飞,所以我们把这两个赋予变化的行为提取出来。

    <?php
    abstract class Duck{
        public $flyBehavior;
        public $quackBehavior;    
    
        public function __construct(){
        }
    
        public function performFly(){
            $this->flyBehavior->fly();
        }
    
        public function performQuack(){
            $this->quackBehavior->quack();
        }
    
        public function setFlyBehavior(FlyBehavior $fb){
            $this->flyBehavior = $fb;
        }
    
        public function setQuackBehavior(QuackBehavior $qb){
            $this->quackBehavior = $qb;
        }
    
        public function swim(){
    
        }
        
        abstract function display();
    }
    
    interface FlyBehavior{
        public function fly();
    }
    class FlywithWings implements FlyBehavior{
        public function fly(){
            echo "i'm flying!
    ";
        }
    }
    class FlyNoWay implements FlyBehavior{
        public function fly(){
            echo "i can't fly.
    ";
        }
    }
    class FlyRocketPowered implements FlyBehavior{
        public function fly(){
            echo "i'm flying with a rocket!
    ";
        }
    }
    
    interface QuackBehavior{
        public function quack();
    }
    class Quack implements QuackBehavior{
        public function quack(){
            echo "quack!
    ";
        }
    }
    class MuteQuack implements QuackBehavior{
        public function quack(){
            echo "silence
    ";
        }
    }
    
    
    class MallardDuck extends Duck{
        public function __construct(){
            $this->quackBehavior = new Quack();
            $this->flyBehavior = new FlyNoWay();
        }
    
        public function display(){
            echo "i'm a real mallar duck
    ";
        }    
    }
    
    $duck = new MallardDuck;
    $duck->performFly();
    $duck->setFlyBehavior(new FlyRocketPowered);
    $duck->performFly();
    ?>
    

     从上面的代码可以看出我们把鸭子抽象出来,而飞行行为和呱呱叫行车以接口的形式,设计的原则是多用组合,少用继承,用上面的写法,相对弹性大点,不仅将算法封装成类,更可以“在运行时动态的改变行为”,只要组合行为对象符合正确的接口标准即可。

  • 相关阅读:
    C++中左移<<的使用
    学会构造素数序列
    有关lower_bound()函数的使用
    Codeforces Round #166 (Div. 2)
    暴力swap导致TLE问题解决办法
    memset的正确使用
    Codeforces Round #297 (Div. 2)
    Codeforces Round #170 (Div. 2)B
    Codeforces Round #176 (Div. 2)
    C/C++ sort函数的用法
  • 原文地址:https://www.cnblogs.com/jaky666/p/4226102.html
Copyright © 2011-2022 走看看