책에 나오는 예문은 비교적 이해하기 쉽지만, 외국인이 쓴 글이라 그다지 중국풍이 아니어서 가끔 조금 어색해 보일 수도 있고, 언어습관도 중국풍이 아닙니다. 물론 이 책을 읽고 나면 디자인 패턴이 어떤 문제를 해결할 수 있고 어떤 문제를 해결할 수 없는지 깊이 이해할 수 있습니다(예: 코딩을 대체할 수 없음).
책에 나오는 코드 중 일부를 PHP로 변경했습니다. 코드를 보고 개념과 결합해 보면 이해가 더 쉬울 것 같아요.
전략 모드
코드 복사 코드는 다음과 같습니다.
/**
* 전략 패턴
*은 알고리즘 계열을 정의하고 서로 교체할 수 있도록 별도로 캡슐화합니다.
* 이 모드는 알고리즘을 사용하는 고객과 독립적으로 알고리즘을 변경합니다.
*/
//비행 동작 인터페이스
interface FlyBehavior {
public function fly()
}
//Quack 동작 인터페이스
interface QuackBehavior {
public function quack( );
//날개 비행
class FlyWithWings Implements FlyBehavior {
public function fly() {
echo "나는 날고 있어요!!n"; }
}
//날 수 없음
class FlyNoWay는 FlyBehavior를 구현합니다. {
public function fly() {
echo "나는 날 수 없습니다!n"
}
}
class FlyRocketPowered는 FlyBehavior를 구현합니다. {
public function fly() {
echo "I'm Flying with a Rocket!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 abstract function display()
public function doneQuack(); quack_obj-> quack();
}
공용 함수 PerformFly() {
$this->fly_obj->fly()
}
공용 함수 swim() {
echo "모든 오리는 미끼도 떠다닙니다!n"
}
공개 함수 setFlyBehavior(FlyBehavior $fb) {
$this->fly_obj =
}
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 "나는 model duck!n ";
}
}
$model = new ModelDuck();
$model->performFly();
$model->performQuack();
// 새로운 기능 제공
$model->setFlyBehavior(new FlyRocketPowered())
$model->setQuackBehavior(new Squeak())
$model->performFly() ;
$model->performQuack();
?>
단일 모드
/*** 싱글톤 패턴 * 클래스에 인스턴스가 하나만 있는지 확인하고 전역 액세스 지점을 제공합니다.
*/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)
$myClass: :getInstance();
var_dump($myClass);
?>
팩토리 메소드 패턴
코드 복사
코드는 다음과 같습니다.
추상 클래스 PizzaStore {
공용 함수 orderPizza($type) {
$pizza = $this->createPizza($type);
$피자->준비();
$pizza->bake();
$피자->컷();
$pizza->box();
$pizza 반환;
}
공용 추상 함수 createPizza($type);
}
class NYPizzaStore extends PizzaStore {
public function createPizza($type) {
if ($type == "cheese") {
return new NYStyleCheesePizza();
} elseif ($type == "veggie") {
새 NYStyleVeggiePizza() 반환;
} elseif ($type == "clam") {
새 NYStyleClamPizza() 반환;
} elseif ($type == "paperoni") {
return new NYStylePapperoniPizza();
} else {
null을 반환합니다.
}
}
}
class ChicagoPizzaStore extends PizzaStore {
public function createPizza($type) {
if ($type == "cheese") {
return new ChicagoStyle치즈피자();
} elseif ($type == "veggie") {
새 ChicagoStyleVeggiePizza() 반환;
} elseif ($type == "clam") {
새 ChicagoStyleClamPizza() 반환;
} elseif ($type == "paperoni") {
return new ChicagoStylePapperoniPizza();
} else {
null을 반환합니다.
}
}
}
추상 클래스 피자 {
공개 $name;
공개 $dough;
공개 $소스;
공개 $toppings = 배열();
공개 함수 prepare() {
echo "준비 중" . $this->이름 . "N";
echo "요싱 반죽...n";
echo "소스 추가 중...n";
echo "토핑 추가: n";
for ($i = 0; $i echo " " . $this->토핑[$i] . "N";
}
}
공개 함수 baking() {
echo "350n에서 25분간 굽습니다";
}
public function cut() {
echo "피자를 대각선 조각으로 자르기";
}
공용 함수 box() {
echo "공식 PizzaStore 상자에 피자 놓기";
}
공용 함수 getName() {
return $this->name;
}
}
class NYStyleCheesePizza는 Pizza를 확장합니다. {
public function __construct() {
$this->name = "NY Style Sauce and Cheese Pizza";
$this->dough = "얇은 크러스트 반죽";
$this->sauce = "마리나라 소스";
$this->toppings[] = "갈은 레지아노 치즈";
}
}
class NYStyleVeggiePizza는 Pizza를 확장합니다. {
public function __construct() {
$this->name = "NY Style Sauce and veggie Pizza";
$this->dough = "얇은 크러스트 반죽";
$this->sauce = "마리나라 소스";
$this->toppings[] = "갈은 레지아노 야채";
}
}
class NYStyleClamPizza는 Pizza를 확장합니다. {
public function __construct() {
$this->name = "NY Style Sauce and clam Pizza";
$this->dough = "얇은 크러스트 반죽";
$this->sauce = "마리나라 소스";
$this->toppings[] = "갈은 레지아노 조개";
}
}
class NYStylePapperoniPizza는 피자를 확장합니다 {
public function __construct() {
$this->name = "NY Style Sauce and papperoni Pizza";
$this->dough = "얇은 크러스트 반죽";
$this->sauce = "마리나라 소스";
$this->toppings[] = "갈은 레지아노 파페로니";
}
}
class ChicagoStyleCheesePizza는 피자를 확장합니다. {
공용 함수 __construct() {
$this->name = "시카고 스타일 딥 디쉬 치즈 피자";
$this->dough = "아주 두꺼운 크러스트 반죽";
$this->sauce = "매실 토마토 소스";
$this->toppings[] = "잘게 썬 모짜렐라 치즈";
}
공개 함수 cut() {
echo "피자를 정사각형 조각으로 자르기";
}
}
$myStore = new NYPizzaStore();
$chicagoStore = 새로운 ChicagoPizzaStore();
$pizza = $myStore->orderPizza("치즈");
echo "Ethan이 주문한 것" . $pizza->getName() . "N";
$pizza = $chicagoStore->orderPizza("치즈");
echo "Ethan이 주문한 것" . $pizza->getName() . "N";
?>
复代码 代码如下:
추상 클래스 PizzaStore {
공용 함수 orderPizza($type) {
$pizza = $this->createPizza($type);
$피자->준비();
$pizza->bake();
$피자->컷();
$pizza->box();
$pizza 반환;
}
공용 추상 함수 createPizza($type);
}
class NYPizzaStore는 PizzaStore를 확장합니다. {
공용 함수 createPizza($type) {
$pizza = null;
$ingredientFactory = 새로운 NYPizzaIngredientFactory();
if ($type == "cheese") {
$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 == "paperoni") {
$pizza = new PapperoniPizza($ingredientFactory);
$pizza->setName('뉴욕 스타일 파페로니 피자');
}
$pizza 반환;
}
}
class ChicagoPizzaStore extends PizzaStore {
public function createPizza($type) {
if ($type == "cheese") {
return new ChicagoStyleCheesePizza();
} elseif ($type == "veggie") {
새 ChicagoStyleVeggiePizza() 반환;
} elseif ($type == "clam") {
새 ChicagoStyleClamPizza() 반환;
} elseif ($type == "paperoni") {
return new ChicagoStylePapperoniPizza();
} else {
null을 반환합니다.
}
}
}
인터페이스 PizzaIngredientFactory {
공용 함수 createDough();
공용 함수 createSauce();
공용 함수 createCheese();
공개 함수 createVeggies();
공용 함수 createPepperoni();
공용 함수 createClam();
}
class NYPizzaIngredientFactory는 PizzaIngredientFactory를 구현합니다. {
public function createDough() {
return new ThinCrustDough();
}
공용 함수 createSauce() {
return new MarinaraSauce();
}
공용 함수 createCheese() {
return new ReggianoCheese();
}
공용 함수 createVeggies() {
$veggies = array(
new Garlic(),
new Onion(),
new Mushroom(),
new RedPepper (),
);
$veggies를 반환합니다.
}
공용 함수 createPepperoni() {
새 SlicedPepperoni()를 반환합니다.
}
공용 함수 createClam() {
새 FreshClams()를 반환합니다.
}
}
class ChicagoPizzaIngredientFactory는 PizzaIngredientFactory {
public function createDough() {
return new ThickCrustDough();
}
공용 함수 createSauce() {
새 PlumTomatoSauce()를 반환합니다.
}
공용 함수 createCheese() {
return new Mozzarella();
}
공용 함수 createVeggies() {
$veggies = array(
new BlackOlives(),
new Spinach(),
new EggPlant(),
);
$veggies를 반환합니다.
}
공용 함수 createPepperoni() {
새 SlicedPepperoni()를 반환합니다.
}
공용 함수 createClam() {
새 FrozenClams()를 반환합니다.
}
}
추상 클래스 피자 {
공개 $name;
공개 $dough;
공개 $소스;
공개 $veggies = 배열();
공개 $cheese;
공개 $pepperoni;
공개 $clam;
공개 추상 함수 prepare();
공개 함수 baking() {
echo "350n에서 25분간 굽습니다";
}
public function cut() {
echo "피자를 대각선 조각으로 자르기";
}
공용 함수 box() {
echo "공식 PizzaStore 상자에 피자 놓기";
}
공용 함수 getName() {
return $this->name;
}
공용 함수 setName($name) {
$this->name = $name;
}
공용 함수 __toString() {
}
}
class CheesePizza는 Pizza를 확장합니다 {
public $ingredientFactory;
공용 함수 __construct(PizzaIngredientFactory $ingredientFactory) {
$this->ingredientFactory = $ingredientFactory;
}
공개 함수 prepare() {
echo "준비 중" . $this->이름 . "N";
$this->dough = $this->ingredientFactory->createDough();
$this->sauce = $this->ingredientFactory->createSauce();
$this->cheese = $this->ingredientFactory->createCheese();
}
}
class ClamPizza는 Pizza {
public $ingredientFactory를 확장합니다.
공용 함수 __construct(PizzaIngredientFactory $ingredientFactory) {
$this->ingredientFactory = $ingredientFactory;
}
공개 함수 prepare() {
echo "준비 중" . $this->이름 . "N";
$this->dough = $this->ingredientFactory->createDough();
$this->sauce = $this->ingredientFactory->createSauce();
$this->cheese = $this->ingredientFactory->createCheese();
$clam = $this->ingredientFactory->createClam();
}
}
$nyPizzaStore = new NYPizzaStore();
$nyPizzaStore->orderPizza('치즈');
?>
현재 페이지 1/2 12다음 페이지
위 내용은 Head First 디자인 패턴 "Head First Design Pattern" 코드 PHP 버전의 객체지향 학습 페이지 1/2에 Head First 디자인 패턴의 내용을 포함하여 소개하고 있으니, PHP에 관심 있는 친구들에게 도움이 되었으면 좋겠습니다. 튜토리얼.