PHP 디자인 모드 의 장식 자 모드

4158 단어 장식 자 모드
장식 자 모델 을 소개 하여 동태 적 으로 책임 을 대상 에 부가 하 다.기능 을 확장 하려 면 장식 자 는 계승 보다 더 탄력 있 는 대체 방안 을 제공 합 니 다.사유 지도
装饰者模式
 
식당 주문 시스템 을 만 드 는 프로젝트 가 있 습 니 다.최초의 코드 구 조 는 이렇다.앞 에 Beverage 의 상속 류 가 많 습 니 다.지금 문제 가 되 는 것 은 우유 의 가격 이 올 랐 다 는 것 입 니 다.그러면 모든 관련 류 를 우 리 는 조정 해 야 합 니 다.예 를 들 어 Milk,SugarAndMilk 류 등 이 많 습 니 다.우 리 는 유형 중의 방법 을 하나씩 수정 해 야 합 니 다.개발 자 는 매번 이런 일 을 하 는데 미 치 겠 습 니 다!그래서 우 리 는 기 존의 구 조 를 바 꿔 야 한다.아래 의 그림 은 모두 약도 이 고 실제 그림 은 이렇게 간단 하지 않다.
 

 
 디자인 문제:
1 류 수량 이 폭발 하여 여러 가지 유형 이 있어 유지 하기 어렵다.2)전체적인 디자인 이 딱딱 하 다.3>기본 클래스 에 추 가 된 새로운 기능 은 하위 클래스 에 사용 할 수 없습니다.재 활용 방법 은 상속,조합,의뢰 등 이 많다.왜 항상 계승 에 익숙 합 니까?젠 드 프레임 워 크 에 도 이런 습관 이 있 는 것 같 아 요!매번 대응 방법 을 찾 을 때마다 계속 위로 뒤집다.별말!!!!나중에 팀 의 연 구 를 통 해 우 리 는 기초 류 를 추출 하기 로 결정 했다.예 를 들 어 우 리 는 커피 를 하나의 단독 류 로 만 들 고 다른 커피,예 를 들 어 우유 커피,달콤 한 커피 등 우 리 는 재료 에 대해 한 가지 유형 으로 만 포장 하기 로 했다.개량 된 디자인:

상세 1>음료 에 대해 우 리 는 Beverage 류 를 직접 계승 하여 가격 을 음료 류 에 직접 기입 한다.2>조미료 가 필요 한 특수 음료 에 대해 우 리 는 누적 작업 을 한다.예 를 들 어 저 는 우유 커피 한 잔 을 원 하면 총가격=커피 가격+우유 가격 3>과 같은 다른 음 료 는 그 가격 을 쉽게 알 수 있 습 니 다.코드
 
<?php
abstract class Beverage{
public $_name;
abstract public function Cost();
}
//
class Coffee extends Beverage{
public function __construct(){
$this->_name = 'Coffee';
}
public function Cost(){
return 1.00;
}
}
//
class CondimentDecorator extends Beverage{
public function __construct(){
$this->_name = 'Condiment';
}
public function Cost(){
return 0.1;
}
}
class Milk extends CondimentDecorator{
public $_beverage;
public function __construct($beverage){
$this->_name = 'Milk';
if($beverage instanceof Beverage){
$this->_beverage = $beverage;
}else
exit('Failure');
}
public function Cost(){
return $this->_beverage->Cost() + 0.2;
}
}
class Sugar extends CondimentDecorator{
public $_beverage;
public function __construct($beverage){
$this->_name = 'Sugar';
if($beverage instanceof Beverage){
$this->_beverage = $beverage;
}else{
exit('Failure');
}
}
public function Cost(){
return $this->_beverage->Cost() + 0.2;
}
}
// Test Case
//1.
$coffee = new Coffee();
//2.
$coffee = new Milk($coffee);
//3.
$coffee = new Sugar($coffee);
printf("Coffee Total:%0.2f
",$coffee->Cost());
요약 1.장식 자(Milk)와 피 장식 자(Coffee)는 반드시 같은 유형 이 어야 한다.목적 은 장식 자가 반드시 피 장식 자 를 대체 해 야 한 다 는 것 이다.2.행동 추가:장식 자 와 구성 요소 가 조합 되 었 을 때 새로운 행동 을 추가 합 니 다.주제:1.계승 디자인 의 하위 행 위 를 이용 하여 컴 파일 할 때 정적 으로 결정 되 고 모든 하위 클래스 는 같은 행 위 를 계승 합 니 다.예 를 들 어 아버 지 는 쿵 푸 를 좀 배우 고 싶 어 하 십 니 다.네 녀석 이 태극권 을 할 줄 아 는 것 을 보 니 아버 지 는 너 를 계승 하기 만 하면 아버지 도 태극권 을 할 것 입 니 다.하하,이때 아버 지 는 네 아들 이 되 었 으 니 계승 은 대 가 를 치 러 야 할 것 같 습 니 다.2.조합,우 리 는 대상 의 행동 을 확장 하여 실행 할 때 동적 으로 확장 할 수 있 습 니 다.조합 을 이용 하여 우 리 는 기 존의 코드 를 바 꾸 지 않 고 그 당시 에 생각 하지 못 했 던 방법 을 수시로 대상 에 넣 을 수 있다.예 를 들 어 노 자 는 지금 내력 이 없다.흡 공 대 법 은 스님,비구니,도사 의 내력(행위 대상)을 모두 빨 아들 일 수 있다.그러면 격투(운행 시)에서 노 자 는 언제든지 다른 내력 을 사용 할 수 있 지만 내력 을 함부로 빨 아들 일 수 없다.그렇지 않 으 면 너 는 화 에 중독 될 것 이다!3.클래스 는 확장 에 개방 하고 수정 에 대해 닫 아야 합 니 다.만약 에 우리 가 모든 부분 을 장식 자 모델 로 디자인 한다 면 전체 구조 에 있어 낭비 가 있 고 코드 의 난이도 도 높 일 수 있다.그럼 이런 모드 는 언제 사용 하나 요?우 리 는 일반적으로 자주 바 뀌 는 곳 에 쓴다.그럼 우 리 는 또 어떤 것 이 자주 바 뀌 는 곳 인지 어떻게 알 수 있 습 니까?이것 은 우리 의 경험 과 당신 이 처 한 업계 에 대한 이해 가 필요 합 니 다.여러분 들 이 평소에 예 를 많이 보 는 것 을 건의 합 니 다.4.장식 모델 은 디자인 에 탄력 을 불 어 넣 지만 디자인 에 대량의 소 류 를 넣 기 때문에 가끔 은 다른 사람 이 이런 디자인 을 이해 하기 어렵다.5.장식 자 모드 를 사용 할 때 는 삽 입 된 장식 자 에 게 특히 조심해 야 한다.장식 자 모드 는 특정한 유형(Beverage)에 의존 하기 때문이다.6.장식 자 모드 를 잘 사용 하려 면 공장 모드 와 생 성기 모드 를 함께 사용 해 야 하 는데 오늘 은 장식 자 모드 만 말한다.더 많은 것 을 알 고 싶 으 면 다음 회 분 해 를 들 으 세 요.참고 문헌:

좋은 웹페이지 즐겨찾기