ホームページ  >  記事  >  バックエンド開発  >  「Head First デザインパターン」コード PHP 編 (オブジェクト指向学習) ページ 1/2_PHP チュートリアル

「Head First デザインパターン」コード PHP 編 (オブジェクト指向学習) ページ 1/2_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:36:241038ブラウズ

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

ストラテジーモード

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

/**
* 戦略パターン
* アルゴリズムのファミリーを定義し、相互に置き換えることができるように個別にカプセル化します。
* このモードでは、アルゴリズムを使用する顧客から独立してアルゴリズムを変更できます。
*/
//フライング動作インターフェース
インターフェース FlyBehavior {
public function fly() ;
}
//Quack 動作インターフェイス
interface QuackBehavior {
public function quack();
}
//翼の飛行
class FlyWithWingsimplements FlyBehavior {
public function fly() {
echo "私は飛んでいます!!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 "<< Silence >>n";

抽象クラス Duck {
protected $quack_obj;
public 関数 replace();
$this->quack_obj->
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->quack_obj = $qb;
}
}

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

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



コードをコピー

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


/**
* シングルトン パターン
* クラスにインスタンスが 1 つだけあることを保証し、グローバル アクセス ポイントを提供します。
*/
class MyClass { private static $uniqueInstance; private function __construct() { }
パブリック静的関数 getInstance() {
if (self::$uniqueInstance == null) {
self::$uniqueInstance = new MyClass();
}
return self::$uniqueInstance
}
}
$ myClass = MyClass:: getInstance();
$myClass::getInstance();


ファクトリーメソッドパターンをコピーします。コード

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

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

$ピザ->準備();
$ピザ->ベイク();
$ピザ->カット();
$ピザ->ボックス();
$ピザを返します;
}

パブリック抽象関数 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") {
return new 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;
パブリック$ソース;
パブリック $トッピング = 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 = 新しい NYPizzaStore();
$chicagoStore = 新しい ChicagoPizzaStore();
$pizza = $myStore->orderPizza("チーズ");
エコー「イーサンは、を注文しました。」 $pizza->getName() 。 「ん」;

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

?>

工厂モード
复制代码代码如下:

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

$ピザ->準備();
$ピザ->ベイク();
$ピザ->カット();
$ピザ->ボックス();
$ピザを返します;
}

パブリック抽象関数 createPizza($type);
}
class NYPizzaStore extends PizzaStore {
public function createPizza($type) {
$pizza = null;
$ingredientFactory = 新しい NYPizzaIngredientFactory();
if ($type == "チーズ") {
$pizza = 新しい 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('ニューヨークスタイル パパロニピザ');
}
$ピザを返します;
}
}
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;
パブリック$ソース;
パブリック $veggies = array();
パブリック$チーズ;
パブリック$ペパロニ;
公開 $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('チーズ')>


http://www.bkjia.com/PHPjc/322141.html
www.bkjia.com

tru​​ehttp://www.bkjia.com/PHPjc/322141.html技術記事この本の例文は比較的分かりやすいですが、外国人が書いているため、例文の習慣が中国人の特徴とあまり合っていない場合があり、少しぎこちなく見えることもあり、言語習慣も一貫性がありません...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。