Head First-ポリシーモード

2198 ワード

ポリシー・モードとは、ポリシー・モードとは何かを定義し、アルゴリズム・ファミリーを定義し、それぞれカプセル化し、それらの間を互いに置き換えることができます.このモードは、アルゴリズムの変化をアルゴリズムを使用する顧客とは独立させます.
次に、アヒルを使って戦略モデルを解釈します.アヒルには2つの行為がありますが、すべてのアヒルがガチャガチャと飛ぶわけではありません.だから、この2つの変化を与える行為を抽出します.
<?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(); ?>

上のコードから私たちがアヒルを抽象化していることがわかりますが、飛行行為とガチャガチャ運転はインタフェースの形式で、設計の原則は多用組合せで、継承を少なくして、上の書き方で、相対的に弾力性が大きい点で、アルゴリズムをクラスにパッケージするだけでなく、「運転時に動的に行為を変える」ことができます.組合せ行為の対象が正しいインタフェースの基準に合致すればいいです.