代码均来源于 《PHP设计模式》一书
- ?/**
- * "PHP 디자인 패턴" 6장: 데코레이터 패턴에서 재인쇄됨
- *
- * 데코레이터 디자인 패턴은 다음 작업 공간에 적합합니다. 요구 사항의 변경이 빠르고 작으며 애플리케이션에 거의 영향을 미치지 않습니다. .다른 부분. ()
- * 데코레이터 디자인 패턴을 사용하여 클래스를 디자인하는 목표는 기존 기능 코드를 다시 작성할 필요 없이 객체에 점진적인 변경 사항을 적용하는 것입니다.
- * 데코레이터 디자인 패턴은 다른 코드 흐름에 영향을 주지 않고 기본 코드 흐름에서 대상 객체를 변경하거나 "장식"하는 하나 이상의 데코레이터를 직접 삽입할 수 있는 방식으로 구축되었습니다.
- *
- */
- class CD {
- public $trackList;
-
- public function __construct () {
- $this->trackList = array();
- }
-
- 공개 함수 addTrack($track) {
- $this->trackList[] = $track;
- }
-
- 공용 함수 getTrackList() {
- $output = '';
-
- foreach ($this->trackList as $num => $track) {
- $output .= ($num 1) . ") {$track}.";
- }
-
- return $output;
- }
- }
-
- $tracksFroExternalSource = array("의미", "Brr ", "작별 인사");
-
- $myCD = 새 CD();
- foreach ($tracksFroExternalSource as $track) {
- $myCD->addTrack($track);
- }
-
- print "CD에는 다음이 포함됩니다:{$myCD->getTrackList()}n";
-
- /**
- * 요구사항의 작은 변경: 각 출력 매개변수가 대문자여야 합니다. 이러한 작은 변경의 경우 가장 좋은 접근 방식은 기본 클래스를 수정하거나 상위-하위 관계를 생성하는 것이 아니라
- 객체를 생성하는 것입니다. 데코레이터 디자인 패턴을 기반으로 합니다.
- *
- */
- class CDTrackListDecoratorCaps {
- private $_cd;
-
- 공용 함수 __construct(CD $cd) {
- $this->_cd = $cd;
- }
-
- 공용 함수 makeCaps() {
- foreach ($this->_cd->trackList as & $track) {
- $track = strtoupper($track);
- }
- }
- }
-
- $myCD = 새 CD();
- foreach($tracksFroExternalSource as $track) {
- $myCD->addTrack($track);
- }
-
- //新增以下代码实现输출参数采用大写shape式
- $myCDCaps = new CDTrackListDecoratorCaps($myCD);
- $myCDCaps->makeCaps();
-
- print "CD에 포함된 항목:{$myCD->getTrackList() }n";
-
- /* Decorator.class.php 끝 */
- /* Design/Decorator.class.php 파일 위치 */
复system代码
- ?/**
- * "PHP 디자인 패턴" 7장: 위임 패턴에서 재인쇄
- * 객체가 결정에 따라 실행되어야 하는 여러 복잡하고 독립적인 기능 부분을 포함하는 경우 가장 좋은 방법은 위임 기반 디자인 패턴 객체를 적용하는 것입니다. .
- *
- */
- /**
- * 예: 웹사이트에는 MP3 파일의 재생 목록을 생성하는 기능이 있고, 재생 목록을 M3U 또는 PLS 형식으로 다운로드하도록 선택하는 기능도 있습니다.
- *
- * 다음 코드 예제는 일반 모드와 위임 모드의 두 가지 모드 구현을 보여줍니다.
- *
- */
- //常规实现
- 클래스 재생목록 {
-
- 비공개 $_songs;
-
- 공용 함수 __construct() {
- $this->_songs = array();
- }
-
- 공용 함수 addSong($location, $title) {
- $song = array("location" => $location, "title" => $title);
- $this->_songs[] = $song;
- }
-
- 공개 function getM3U() {
- $m3u = "#EXTM3Unn";
-
- foreach ($this->_songs as $song) {
- $m3u .= "#EXTINF: -1, { $song['title']}n";
- $m3u .= "{$song['location']}n";
- }
-
- return $m3u;
- }
-
- 공개 함수 getPLS() {
- $pls = "[재생 목록]]nNumberOfEntries = ". count($this->_songs) . "nn";
-
- foreach ($this->_songs as $songCount => $song) {
- $counter = $songCount 1;
- $pls .= "파일{$counter } = {$song['location']}n";
- $pls .= "제목{$counter} = {$song['title']}n";
- $pls .= "길이P{ $counter} = -1 nn";
- }
-
- return $pls;
- }
- }
-
- $playlist = new Playlist();
-
- $playlist->addSong("/home/aaron/music/brr.mp3", "Brr");
- $playlist->addSong("/home/aaron/music/goodbye.mp3", " 안녕히 계세요");
-
- $externalRetrievedType = "pls";
-
- if ($externalRetrievedType == "pls") {
- $playlistContent = $playlist->getPLS();
- } else {
- $playlistContent = $playlist->getM3U();
- }
-
- echo $playlistContent;
-
- //委托模式实现
- class newPlaylist {
-
- 비공개 $_songs;
- 비공개 $_tyepObject;
-
- 공개 함수 __construct($type) {
- $this->_songs = array();
- $ object = "{$type}Playlist";
- $this->_tyepObject = new $object;
- }
-
- 공개 함수 addSong($location, $title) {
- $song = array("위치" => $위치, "제목" => $title);
- $this->_songs[] = $song;
- }
-
- public function getPlaylist() {
- $playlist = $this->_tyepObject-> getPlaylist($this->_songs);
- return $playlist;
- }
- }
-
- class m3uPlaylist {
- public function getPlaylist($songs) {
- $m3u = "#EXTM3Unn";
-
- foreach ($songs as $song) {
- $m3u .= "#EXTINF: -1, {$song['title']}n";
- $m3u .= "{$song['location']}n";
- }
-
- return $m3u;
- }
- }
-
- class plsPlaylist {
- 공개 함수 getPlaylist($songs) {
- $pls = "[재생 목록]]nNumberOfEntries = ". 개수($노래) . "nn";
-
- foreach ($songs as $songCount => $song) {
- $counter = $songCount 1;
- $pls .= "File{$counter} = {$ 노래['location']}n";
- $pls .= "제목{$counter} = {$song['title']}n";
- $pls .= "길이P{$counter} = -1 nn";
- }
-
- return $pls;
- }
- }
-
- $externalRetrievedType = "pls";
- $playlist = new newPlaylist($ externalRetrievedType);
-
- $playlist->addSong("/home/aaron/music/brr.mp3", "Brr");
- $playlist->addSong("/home/aaron/ music/goodbye.mp3", "Goodbye");
-
- $playlistContent = $playlist->getPlaylist();
-
- echo $playlistContent;
-
- /* 끝 Delegate.class.php */
- /* Design/Delegate.class.php 파일 위치 */
复主代码
- ?/**
- * "PHP 디자인 패턴" 8장: 모양 패턴에서 재인쇄
- * 모양 디자인 패턴의 목표는 복잡한 외부 관계를 제어하고 위 구성 요소의 기능을 활용할 수 있는 간단한 인터페이스를 제공하는 것입니다.
- * 비즈니스 프로세스의 특정 단계를 수행하는 데 필요한 복잡한 방법과 논리 그룹을 숨기기 위해서는 외관 디자인 패턴을 기반으로 하는 클래스를 사용해야 합니다.
- *
- */
- /**
- * 코드 예: CD 개체를 가져오고 모든 속성에 대문자를 적용한 다음 웹 서비스에 제출할 완전한 형식의 XML 문서를 만듭니다.
- *
- */
- 수업 CD {
-
- public $tracks = array();
- public $band = '';
- public $title = '';
-
- public function __construct($tracks, $band, $title) {
- $this->tracks = $tracks;
- $this->band = $band;
- $this->title = $title;
- }
-
- }
-
- class CDUpperCase {
-
- public static function makeString(CD $cd, $type) {
- $cd->$type = strtoupper($cd->$type);
- }
-
- 공개 정적 함수 makeArray(CD $cd, $type) {
- $cd->$type = array_map("strtoupper", $cd->$type);
- }
- }
-
- class CDMakeXML {
-
- public static function create(CD $cd) {
- $doc = new DomDocument();
-
- $root = $doc->createElement("CD");
- $root = $doc->appendChild($root);
-
- $title = $doc->createElement("TITLE", $cd->title);
- $title = $root->appendChild($title);
-
- $band = $doc->createElement("BAND", $cd-> band);
- $band = $root->appendChild($band);
-
- $tracks = $doc->createElement("TRACKS");
- $tracks = $root- >appendChild($tracks);
-
- foreach ($cd->$track으로 트랙) {
- $track = $doc->createElement("TRACK", $track);
- $track = $tracks->appendChild($track);
- }
-
- return $doc->saveXML();
- }
- }
-
- class WebServiceFacade {
-
- 공개 정적 함수 makeXMLCall(CD $cd) {
- CDUpperCase::makeString($cd, "title");
- CDUpperCase::makeString($cd, "band");
- CDUpperCase::makeArray($cd, "tracks");
-
- $xml = CDMakeXML::create($cd);
-
- return $xml;
- }
- }
-
- $tracksFromExternalSource = array("What It Means", "Brr", "Goodbye");
- $band = "다시는 안 해";
- $title = "갈비뼈 낭비 ";
-
- $cd = 새 CD($tracksFromExternalSource, $band, $title);
-
- $xml = WebServiceFacade::makeXMLCall($cd);
-
- echo $ xml;
-
-
- /* Facade.class.php 끝 */
- /* Design/Facade.class.php 파일 위치 */
复代码
- ?/**
- * "PHP 디자인 패턴" 9장에서 재인쇄됨: 팩토리 패턴
- * 팩토리 디자인 패턴: 호출 코드가 실제로 인스턴스화하는 단계를 결정하지 않도록 하면서 객체의 새 인스턴스를 얻기 위한 인터페이스를 제공합니다. 기본 클래스
- *
- */
- //기본 표준 CD 클래스
- 클래스 CD {
-
- 공개 $tracks = array();
- 공개 $band = '';
- 공개 $title = '';
-
- 공개 함수 __construct() {}
-
- 공개 함수 setTitle( $title) {
- $this->title = $title;
- }
-
- 공개 함수 setBand($band) {
- $this->band = $band;
- }
-
- 공개 함수 addTrack($track) {
- $this->tracks[] = $track;
- }
-
- }
-
- // Enhanced CD 클래스, 표준 CD와의 유일한 차이점은 CD에 기록된 첫 번째 트랙이 데이터 트랙("DATA TRACK")
- class EnhancedCD {
-
- public $tracks = array();
- 공개 $band = '';
- 공개 $title = '';
-
- 공개 함수 __construct() {
- $this->tracks = "DATA TRACK";
- }
-
- 공용 함수 setTitle($title) {
- $this->title = $title;
- }
-
- 공용 함수 setBand($band) {
- $this -> ;band = $band;
- }
-
- 공개 함수 addTrack($track) {
- $this->tracks[] = $track;
- }
- }
-
- //위 두 클래스의 특정 인스턴스화 작업을 구현하는 CD 팩토리 클래스
- class CDFactory {
-
- public static function create($type) {
- $class = strtolower( $ type) . "CD";
-
- return new $class;
- }
- }
-
- //인스턴스 작업
- $type = "enhadced";
-
- $cd = CDFactory::create($type);
-
- $tracksFromExternalSource = array("의미", "Brr", "작별 인사");
-
- $cd- > ;setBand("다시는 안 함");
- $cd->setTitle("갈비뼈 낭비");
- foreach ($tracksFromExternalSource as $track) {
- $cd->addTrack( $ track);
- }
-
-
- /* Factory.class.php 끝 */
- /* 파일 끝 Design/Factory.class.php */
코드 복사
- ?/**
- * "PHP 디자인 패턴" 10장: 인터프리터 패턴에서 재인쇄됨
- * 인터프리터: 인터프리터 디자인 패턴은 엔터티의 핵심 요소를 분석하고 각 요소 작업에 대한 고유한 설명이나 해당 응답을 제공하는 데 사용됩니다.
- * 인터프리터 디자인 패턴은 PHP/HTML 템플릿 시스템에서 가장 일반적으로 사용됩니다.
- *
- */
- class User {
-
- protected $_username = "";
-
- 공용 함수 __construct($username) {
- $this->_username = $username;
- }
-
- 공용 함수 getProfilePage() {
- $profile = "
";
- $profile .= "저는 그들의 노래를 모두 좋아합니다. 제가 가장 좋아하는 CD는
";
- $profile .= "{{ myCD.getTitle}}!!";
-
- return $profile;
- }
- }
-
- class userCD {
-
- protected $_user = NULL;
-
- 공용 함수 setUser(User $user) {
- $this->_user = $user;
- }
-
- 공용 함수 getTitle() {
- $title = "폐기물 갈비뼈";
-
- return $title;
- }
- }
-
- class userCDInterpreter {
-
- protected $_user = NULL;
-
- 공용 함수 setUser(사용자 $user) {
- $this->_user = $user;
- }
-
- 공용 함수 getInterpreted() {
- $profile = $this->_user ->getProfilePage();
-
- if (preg_match_all('/{{myCD.(.*?)}}/', $profile, $triggers, PREG_SET_ORDER)) {
- $replacements = 배열 ();
-
- foreach ($trigger를 $trigger로) {
- $replacements[] = $trigger[1];
- }
-
- $replacements = array_unique($replacements) ;
-
- $myCD = new userCD();
- $myCD->setUser($this->_user);
-
- foreach ($replacements를 $replacement로) {
- $profile = str_replace("{{myCD.{$replacement}}}", call_user_func(array($myCD, $replacement)), $profile);
- }
- }
-
- return $profile;
- }
-
- }
-
- $username = "aaron";
- $user = 새 사용자($username);
- $interpreter = 새 userCDInterpreter() ;
- $interpreter->setUser($user);
-
- 인쇄 "
{$username}님의 프로필";
- 인쇄 $interpreter->getInterpreted ();
-
- /* Interpreter.class.php 끝 */
- /* Design/Interpreter.class.php 파일 위치 */
코드 복사
- ?/**
- * "PHP 디자인 패턴" 11장: 반복자 패턴에서 재인쇄됨
- * 반복자: 반복자 디자인 패턴은 셀 수 있는 모든 유형의 데이터를 반복하거나 반복하기 위한 단일 표준 인터페이스를 제공할 수 있는 특정 개체를 구성하는 데 도움이 됩니다.
- * 순회해야 하는 셀 수 있는 데이터를 처리할 때 가장 좋은 솔루션은 반복자 디자인 패턴을 기반으로 객체를 생성하는 것입니다.
- *
- */
- class CD {
-
- public $band = "";
- 공개 $title = "";
- 공개 $trackList = array();
-
- 공개 함수 __construct($band, $title) {
- $this->band = $band;
- $this->title = $title;
- }
-
- 공개 함수 addTrack($track) {
- $this->trackList[] = $track;
- }
- }
-
- class CDSearchByBandIterator는 Iterator를 구현합니다.
- $db = mysql_connect("localhost", "root", "root");
- mysql_select_db("test");
-
- $sql = "CD.id, CD.band, CD.title, Tracks.tracknum, Tracks.title as tracktitle ";
- $sql .= "CD에서 CD 왼쪽 조인 트랙 CD.id =tracks.cid ";
- $sql .= "여기서 band = ' " . mysql_real_escape_string($bandName) . "' ";
- $sql .= "tracks.tracknum별 순서";
-
- $results = mysql_query($sql);
-
- $cdID = 0;
- $cd = NULL;
-
- while ($result = mysql_fetch_array($results)) {
- if ($result["id"] !== $cdID) {
- if ( ! is_null($cd )) {
- $this->_CDs[] = $cd;
- }
-
- $cdID = $result['id'];
- $cd = 새 CD($result ['밴드'], $result['title']);
- }
-
- $cd->addTrack($result['tracktitle']);
- }
-
- $this->_CDs[] = $cd;
- }
-
- 공개 함수 next() {
- $this->_valid = (next($this->_CDs) = == 거짓) ? FALSE : TRUE;
- }
-
- 공개 함수 rewind() {
- $this->_valid = (reset($this->_CDs) === FALSE) ? FALSE : TRUE;
- }
-
- public function valid() {
- return $this->_valid;
- }
-
- public function current() {
- return current($this->_CDs);
- }
-
- 공개 함수 키() {
- return key($this->_CDs);
- }
- }
-
- $queryItem = "다시는 안 함";
-
- $cds = new CDSearchByBandIterator($queryItem);
-
- print "
다음 CD를 찾았습니다" ;
- "
밴드 | Ttile | 트랙 수 | < /tr>";
- foreach ($cds를 $cd로) {
- print "
{$cd->band} | {$cd ->title} | ";
- 인쇄 횟수($cd->trackList). "
| ";
- }
- 인쇄 "
---|
";
-
- /* Iterator.class.php의 끝 */
- / * Design/Iterator.class.php 파일 위치 지정 */
-
-
- 复代码
-
-
- /*
- SQLyog 企业版 - MySQL GUI v8.14
- MySQL - 5.1.52-community : 데이터베이스 - 테스트
- ***** ************************************************** ************
- */
-
- /*!40101 SET NAMES utf8 */;
-
- /*!40101 SET SQL_MODE=''*/ ;
-
- /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
- /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
- / *!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
- /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
- /*테이블의 테이블 구조 ` cd` */
-
- `cd`가 존재하는 경우 테이블 삭제;
-
- CREATE TABLE `cd` (
- `id` int(8) NOT NULL AUTO_INCREMENT,
- `band` varchar(500) COLLATE latin1_bin NOT NULL DEFAULT '',
- `title` varchar(500) COLLATE latin1_bin NOT NULL DEFAULT '',
- `bought` int(8) DEFAULT NULL,
- `amount` int (8) DEFAULT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 COLLATE=latin1_bin;
-
- /*`cd` 테이블에 대한 데이터 * /
-
- `cd`(`id`,`band`,`title`,`bought`,`amount`) 값에 삽입(1,'Never Again','Waster of a Rib',1 ,98);
-
- /*`tracks` 테이블의 테이블 구조 */
-
- DROP TABLE IF EXISTS `tracks`;
-
- CREATE TABLE `tracks`(
- `cid` int(8) DEFAULT NULL,
- `tracknum` int(8) DEFAULT NULL,
- `title` varchar(500) COLLATE latin1_bin NOT NULL DEFAULT ''
- ) ENGINE=InnoDB DEFAULT CHARSET= latin1 COLLATE=latin1_bin;
-
- /*`tracks` 테이블의 데이터 */
-
- `tracks`(`cid`,`tracknum`,`title`) 값에 삽입(1, 3,'의미'),(1,3,'Brr'),(1,3,'안녕');
-
- /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
- /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
- /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
- /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-
제제대码
|