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();
    ?>
    

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

  • 相关阅读:
    (iOS)项目总结-项目中遇到的各种的问题和解决方法
    iOS ---不一样的NSLog打印(精准打印)
    iOS 之 Cocoapods安装
    iOS--关于同步下载
    iOS--NSTimer设置定时器的两种方法
    iOS--创建炫酷的渐变色界面
    Mac OS安装 OpenCV(python3)
    使用ADB无线连接Android真机进行调试
    Hexo 添加 SEO
    如何得体跳槽
  • 原文地址:https://www.cnblogs.com/jaky666/p/4226102.html
Copyright © 2011-2022 走看看