ホームページ > php教程 > php手册 > 「Head First デザインパターン」コード PHP 版 (オブジェクト指向学習) ページ 1/2

「Head First デザインパターン」コード PHP 版 (オブジェクト指向学習) ページ 1/2

WBOY
リリース: 2016-06-13 12:15:01
オリジナル
958 人が閲覧しました

この本の例は比較的理解しやすいものですが、外国人が書いたものであるため、中国人の特徴にあまり合っていない場合があり、言語習慣も中国語ではありません。もちろん、この本を読んだ後は、デザイン パターンでどのような問題を解決できるか、またどのような問題を解決できないか (たとえば、コーディングの代替にはならない) を深く理解できます。
本のコードの一部を PHP に変更しました。コードを見て概念と組み合わせると、より理解しやすくなるはずです。

戦略モード

コードをコピー コードは次のとおりです:


/**
* 戦略パターン
* は、アルゴリズムのファミリーを定義し、相互に置き換えることができるように個別にカプセル化します。
* このモードでは、アルゴリズムを使用する顧客に関係なくアルゴリズムを変更します。
*/
//フライング動作インターフェイス
インターフェイス FlyBehavior {
public function fly();
}
//クワック動作インターフェイス
インターフェイス QuackBehavior {
public function quack();
}
//翼飛行
class FlyWithWingsimplements FlyBehavior {
public function fly() {
echo "I'm fly!!n";
}
}
//飛べません
class FlyNoWayimplements FlyBehavior {
public function fly() {
echo "飛べません!n"
}
}
class FlyRocketPoweredimplements FlyBehavior {
public function fly() {
echo "ロケットで飛んでいます!n";
}
}
class Qquack QuackBehavior を実装します {
public function quack() {
echo "Quackn";
}
}
class Squeak は QuackBehavior を実装します {
public function quack() {
echo " Squeakn" ;
}
}
class MuteQuack は QuackBehavior を実装します {
public function quack() {
echo "<<>>n";
}
}
抽象クラス Duck {
protected $quack_obj;
protected $fly_obj;
public function PerformQuack(); this- >quack_obj->quack();
}
public function PerformFly() {
$this->fly_obj->fly();
public function swim( ) {
echo "すべてのアヒルは浮きます!n";
}
public function setFlyBehavior(FlyBehavior $fb) {
$this->fly_obj = $fb; >}
public function setQuackBehavior(QuackBehavior $qb) {
$this->gt;quack_obj = $qb;
}
}

class ModelDuck extends Duck {
public function __construct () {
$this->fly_obj = new FlyNoWay();
$this->gt;quack_obj = new MuteQuack();
public function display(); >echo "私はモデル アヒルです!n";
}
}

$model = new ModelDuck();
$model->performFly(); $model ->performQuack();
//新しい機能を提供します
$model->setFlyBehavior(new FlyRocketPowered());
$model->setQuackBehavior(new Squeak()); 🎜 >$model->performFly();
$model->
?>


単体モード



コードをコピーします

コードは次のとおりです:

/**
* シングルトン パターン

* クラスのインスタンスが 1 つだけ存在することを保証し、グローバル アクセス ポイントを提供します。 */ class MyClass { プライベート static $uniqueInstance; プライベート関数 __construct() {

}
パブリック 静的関数 getInstance() {
if (self::$uniqueInstance == null) {
self::$uniqueInstance = new MyClass();
}
return self::$uniqueInstance;
}
}
$myClass = MyClass::getInstance(); 🎜>var_dump($ myClass);
$myClass::getInstance();
var_dump($myClass);


ファクトリ メソッド パターン>


コードをコピー

コードは次のとおりです:


abstract class PizzaStore {
public function orderPizza($type) {
$pizza = $this->createPizza($type);

$pizza->prepare();
$pizza->bake();
$ピザ->カット();
$pizza->box();
$ピザを返します;
}

パブリック抽象関数 createPizza($type);
}
class NYPizzaStore extends PizzaStore {
public function createPizza($type) {
if ($type == "cheese") {
return new NYStyleCheesePizza();
} elseif ($type == "veggie") {
return new NYStyleVeggiePizza();
} elseif ($type == "clam") {
return new NYStyleClamPizza();
} elseif ($type == "papperoni") {
return new NYStylePapperoniPizza();
} else {
null を返します。

}
}
}
class ChicagoPizzaStore extends PizzaStore {
public function createPizza($type) {
if ($type == "cheese") {
新しい ChicagoStyleCheesePizza() を返します。
} elseif ($type == "veggie") {
return new ChicagoStyleVeggiePizza();
} elseif ($type == "clam") {
return new ChicagoStyleClamPizza();
} elseif ($type == "papperoni") {
return new ChicagoStylePapperoniPizza();
} else {
null を返します。
}
}
}
抽象クラス Pizza {
public $name;
パブリック $dough;
パブリック $sauce;
public $toppings = array();

public function prepare() {
echo "準備中 " 。 $this->name 。 「ん」;
エコー「生地を食べます...n」;
echo "ソースを追加しています...n";
echo "トッピングの追加: n";
for ($i = 0; $i toppings); $i ) {
echo " " . $this->トッピング[$i] 。 「ん」;
}
}

public function bakery() {
echo "350n で 25 分間焼きます";
}

public function Cut() {
echo "ピザを斜めのスライスに切りますn";
}

public function box() {
echo "ピザを公式の PizzaStore ボックスに置きますn";
}

public function getName() {
return $this->name;
}
}

class NYStyleCheesePizza extends Pizza {
public function __construct() {
$this->name = "NY スタイル ソースとチーズのピザ";
$this->dough = "薄い生地の生地";
$this->sauce = "マリナラソース";

$this->トッピング[] = "すりおろしたレッジャーノ チーズ";
}
}

class NYStyleVeggiePizza extends Pizza {
public function __construct() {
$this->name = "NY スタイル ソースと野菜のピザ";
$this->dough = "薄い生地の生地";
$this->sauce = "マリナラソース";

$this->toppings[] = "すりおろしたレッジャーノ野菜";
}
}
class NYStyleClamPizza extends Pizza {
public function __construct() {
$this->name = "NYスタイルソースとアサリのピザ";
$this->dough = "薄い生地の生地";
$this->sauce = "マリナラソース";

$this->トッピング[] = "レッジャーノ貝のすりおろし";
}
}
class NYStylePapperoniPizza extends Pizza {
public function __construct() {
$this->name = "NYスタイルソースとパペロニピザ";
$this->dough = "薄い生地の生地";
$this->sauce = "マリナラソース";

$this->トッピング[] = "すりおろしたレッジャーノ パペロニ";
}
}

class ChicagoStyleCheesePizza extends Pizza {
public function __construct() {
$this->name = "シカゴ スタイル ディープ ディッシュ チーズ ピザ";
$this->dough = "極厚クラスト生地";
$this->sauce = "梅トマトソース";

$this->トッピング[] = "細切りモッツァレラチーズ";
}

public function Cut() {
echo "ピザを正方形のスライスに切りますn";
}
}

$myStore = new NYPizzaStore();
$chicagoStore = new ChicagoPizzaStore();
$pizza = $myStore->orderPizza("チーズ");
エコー「イーサンは " を注文しました。」 $pizza->getName() 。 「ん」;

$pizza = $chicagoStore->orderPizza("チーズ");
エコー「イーサンは " を注文しました。」 $pizza->getName() 。 「ん」;

?>


工厂モード

复制代 代码如下:


abstract class PizzaStore {
public function orderPizza($type) {
$pizza = $this->createPizza($type);

$pizza->prepare();
$pizza->bake();
$ピザ->カット();
$pizza->box();
$ピザを返します;
}

パブリック抽象関数 createPizza($type);
}
class NYPizzaStore extends PizzaStore {
public function createPizza($type) {
$pizza = null;
$ingredientFactory = 新しい NYPizzaIngredientFactory();
if ($type == "チーズ") {
$pizza = new CheesePizza($ingredientFactory);
$pizza->setName('ニューヨーク スタイル チーズ ピザ');
} elseif ($type == "veggie") {
$pizza = new VeggiePizza($ingredientFactory);
$pizza->setName('ニューヨークスタイルのベジピザ');
} elseif ($type == "clam") {
$pizza = new ClamPizza($ingredientFactory);
$pizza->setName('ニューヨーク風クラムピザ');
} elseif ($type == "papperoni") {
$pizza = new PapperoniPizza($ingredientFactory);
$pizza->setName('ニューヨークスタイル パパロニピザ');
}
$pizza を返す;
}
}
class ChicagoPizzaStore extends PizzaStore {
public function createPizza($type) {
if ($type == "cheese") {
return new ChicagoStyleCheesePizza();
} elseif ($type == "veggie") {
return new ChicagoStyleVeggiePizza();
} elseif ($type == "clam") {
return new ChicagoStyleClamPizza();
} elseif ($type == "papperoni") {
return new ChicagoStylePapperoniPizza();
} else {
null を返します。
}
}
}
interface PizzaIngredientFactory {
public function createDough();
パブリック関数 createSauce();
パブリック関数 createCheese();
パブリック関数 createVeggies();
パブリック関数 createPepperoni();
パブリック関数 createClam();
}
class NYPizzaIngredientFactoryimplements PizzaIngredientFactory {
public function createDough() {
return new ThinCrustDough();
}
public function createSauce() {
return new MarinaraSauce();
}
public function createCheese() {
return new ReggianoCheese();
}
public function createVeggies() {
$veggies = array(
new Garlic(),
new Onion(),
new Mushroom(),
new RedPepper ()、
);
$veggies を返します;
}
public function createPepperoni() {
return new SlicedPepperoni();
}
public function createClam() {
return new FreshClams();
}
}
class ChicagoPizzaIngredientFactoryimplements PizzaIngredientFactory {
public function createDough() {
return new ThickCrustDough();
}
public function createSauce() {
return new PlumTomatoSauce();
}
public function createCheese() {
return new Mozzarella();
}
public function createVeggies() {
$veggies = array(
new BlackOlives(),
new Spinach(),
new EggPlant(),
);
$veggies を返します;
}
public function createPepperoni() {
return new SlicedPepperoni();
}
public function createClam() {
return new FrozenClams();
}
}
抽象クラス Pizza {
public $name;
パブリック $dough;
パブリック $sauce;
パブリック $veggies = array();
パブリック $cheese;
パブリック $pepperoni;
パブリック $clam;

パブリック抽象関数 prepare();

public function bakery() {
echo "350n で 25 分間焼きます";
}

public function Cut() {
echo "ピザを斜めのスライスに切りますn";
}

public function box() {
echo "ピザを公式の PizzaStore ボックスに置きますn";
}

public function getName() {
return $this->name;
}

public function setName($name) {
$this->name = $name;
}

public function __toString() {

}
}

class CheesePizza extends Pizza {
public $ingredientFactory;

パブリック関数 __construct(PizzaIngredientFactory $ingredientFactory) {
$this->ingredientFactory = $ingredientFactory;
}

public function prepare() {
echo "準備中 " 。 $this->name 。 「ん」;
$this->dough = $this->ingredientFactory->createDough();
$this->sauce = $this->ingredientFactory->createSauce();
$this->cheese = $this->ingredientFactory->createCheese();
}
}

class ClamPizza extends Pizza {
public $ingredientFactory;

パブリック関数 __construct(PizzaIngredientFactory $ingredientFactory) {
$this->ingredientFactory = $ingredientFactory;
}

public function prepare() {
echo "準備中 " 。 $this->name 。 「ん」;
$this->dough = $this->ingredientFactory->createDough();
$this->sauce = $this->ingredientFactory->createSauce();
$this->cheese = $this->ingredientFactory->createCheese();
$clam = $this->ingredientFactory->createClam();
}
}

$nyPizzaStore = new NYPizzaStore();
$nyPizzaStore->orderPizza('cheese');
?>



ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート