この本の例は比較的理解しやすいですが、外国人が書いたものであるため、中国人の特徴にあまり合っていない場合があり、言語習慣も中国語ではありません。もちろん、この本を読んだ後は、デザイン パターンでどのような問題を解決できるか、またどのような問題を解決できないか (たとえば、コーディングの代替にはならない) を深く理解できます。
本の中のコードの一部をPHPに変更しました。コードを見て概念と組み合わせると理解しやすくなるはずです。
戦略モード
コードをコピー コードは次のとおりです:
/**
* 戦略パターン
* アルゴリズムのファミリーを定義し、相互に置き換えることができるように個別にカプセル化します。
* このモードでは、アルゴリズムを使用する顧客から独立してアルゴリズムを変更できます。
*/
//Flying Behavior Interface
interface FlyBehavior {
public function fly();
}
//Quack 動作インターフェイス
interface QuackBehavior {
public function quack();
}
//Wings fly
class FlyWithWingsimplements FlyBehavior {
public function fly() {
echo "I'm fly!!n" ;
}
}
//飛べません
class FlyNoWay は FlyBehavior を実装します {
public function fly() {
echo "飛べません!n"
}
}
class FlyRocketPowered は 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 抽象関数 show();
$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->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->performQuack();
//新しい機能を提供します
$model->setFlyBehavior( ));
$model->setQuackBehavior(new Squeak());
$model->performQuack()?>
;
コードをコピーします
コードは次のとおりです:
* シングルトン パターン * クラスにインスタンスが 1 つだけあることを保証し、グローバル アクセス ポイントを提供します。 */ class MyClass { private static $uniqueInstance;
private function __construct() {}
public static function getInstance() {
if (self::$uniqueInstance == null) {
self::$uniqueInstance = new MyClass();
}
return self::$uniqueInstance
}
}
$myClass = MyClass: :getInstance();
var_dump ($myClass);
var_dump($myClass);
コードをコピーしますコードは次のとおりです:
复制代代码如下: 現在のページ 1/2 12次のページ
上記はヘッドファーストデザインパターン「Head First Design Pattern」のコードPHP版オブジェクト指向学習ページ1/2の紹介です。ヘッドファーストデザインパターンの内容も含めて、PHPに興味のある友人の参考になれば幸いです。チュートリアル。
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
echo " " . $this->トッピング[$i] 。 「ん」;
}
}
public functionake() {
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 = 新しい NYPizzaStore();
$nyPizzaStore->orderPizza('cheese');
?>