php 디자인 모드(1)--관찰자 모드--spl 표준 표기 법
5287 단어 PHP
[url=http://xieye.iteye.com/blog/2404077]php 디자인 모드(1)--관찰자 모드--spl 표준 표기 법[/url]
[url=http://xieye.iteye.com/blog/2404082]phop 디자인 모델(2)-관찰자 모델-trait 로 개 선 된 쓰기[/url]
[url=http://xieye.iteye.com/blog/2404140]php 디자인 모델(3)-책임 체인(직책 체인)모델[/url]
[url=http://xieye.iteye.com/blog/2404169]php 디자인 모드(4)--장식 기 모드[/url]
본 고 는 관찰자 모델 을 말한다.
부분 코드 원본:
https://www.ibm.com/developerworks/cn/opensource/os-cn-observerspl/
[size=x-large]개술[/size]
[b][size=large]개인의 소감:가장 중요 한 것 은 목표 대상 이 관찰자 대상 에 게 통 지 를 보 낼 때 상대방 의 반환 값 이 필요 없 이 통 지 를 보 내 면 끝 납 니 다.[/size][/b]
그게 제일 중요 해.만약 되 돌아 갈 필요 가 있다 면,이 디자인 모델 을 사용 해 서 는 안 된다.
php 내 에 SplSubject 와 SplObserver 인터페이스,그리고 편리 한 SplObject Storage 류 를 만 들 었 습 니 다.
SplSubject 인 터 페 이 스 는 세 가지 방법 이 필요 합 니 다.
abstract public void attach(SplObserver$observer)관찰자 추가(등록)
abstract public void detach(SplObserver$observer)관찰자 삭제
abstract public void notify(void)상태 가 바 뀌 었 을 때 모든 관찰자 에 게 알 립 니 다.
SplObserver 인 터 페 이 스 는 하나의 방법 이 필요 합 니 다.
abstract public void update(SplSubject$subject)가 목표 가 바 뀌 었 을 때 목표 가 보 낸 알림 을 받 습 니 다.관심 있 는 대상 이 notify()를 호출 할 때 호출 됨
[size=x-large]분석[/size]
다음은 사용자 가 비밀 번 호 를 수정 한 후에 두 가지 통 지 를 보 냅 니 다.하 나 는 이메일 알림 이 고 하 나 는 핸드폰 문자 알림 입 니 다.
수 요 를 분석 하 다.
1.알림 이 필요 없 는 반환 값 입 니 다.
2.목표 가 상태 변화 가 생 겼 을 때(비밀번호 수정)여러 개의 후속 처리 가 있 는데 이때 관찰자 에 게 특히 적합 합 니 다.
3.모니터 와 목표 의 기능 은 비교적 분 리 된 것 이지 밀접 한 관 계 를 가 진 것 이 아니다.하 나 는 통 지 를 보 내 는 것 이 고 하 나 는 데이터 베 이 스 를 바 꾸 는 것 이다.그러면 디자인 모델 을 통 해 업무 논 리 를 분해 할 수 있다.
4.보통[b]모니터 의 코드 를 추가 하고 클 라 이언 트 코드 에[/b]를 씁 니 다.
[size=x-large]코드 구현[/size]
총 4 개의 파일,
User.php,대상
MobileSender.php,어떤 모니터 대상
EmailSender.php,어떤 모니터 대상
Client.php,클 라 이언 트 코드,
이 디자인 모델 에서 클 라 이언 트 코드 는 감청 기 를 추가 합 니 다.
User.php
class User implements SplSubject {
private $email;
private $username;
private $mobile;
private $password;
/**
* @var SplObjectStorage
*/
private $observers = NULL;
public function __construct($email, $username, $mobile, $password) {
$this->email = $email;
$this->username = $username;
$this->mobile = $mobile;
$this->password = $password;
$this->observers = new SplObjectStorage();
}
public function attach(SplObserver $observer) {
$this->observers->attach($observer);
}
public function detach(SplObserver $observer) {
$this->observers->detach($observer);
}
public function notify() {
foreach ($this->observers as $observer) {
$observer->update($this);
}
}
//
public function changePassword($newPassword) {
echo __METHOD__, PHP_EOL;
$this->password = $newPassword;
$this->notify();
}
// , , get
public function get_observer_info(){
return [
"email" => $this->email,
"mobile" => $this->mobile,
"username" => $this->username,
"password" =>$this->password,
];
}
}
MobileSender.php
class MobileSender implements SplObserver {
public function update(SplSubject $subject) {
$userInfo = $subject->get_observer_info();
// 。
echo " {$userInfo['mobile']} 。 : {$userInfo['username']}" .
" {$userInfo['password']}, ", PHP_EOL;
}
}
EmailSender.php
class EmailSender implements SplObserver {
public function update(SplSubject $subject) {
$userInfo = $subject->get_observer_info();
// 。
echo " {$userInfo['email']} 。 : {$userInfo['username']}" .
" {$userInfo['password']}, ", PHP_EOL;
}
}
Client.php:
header('Content-Type: text/plain');
function __autoload($class_name) {
require_once "$class_name.php";
}
//
$user = new User('[email protected]', ' ', '13610002000', '123456');
// ,
$email_sender = new EmailSender();
$mobile_sender = new MobileSender();
$user->attach($email_sender);
$user->attach($mobile_sender);
// , , 。
$user->changePassword('654321');
[size=x-large]
효과 전시[/size]
명령 행 에 php Client.php 를 입력 하면 다음 과 같이 보 여 줍 니 다.
User::changePassword
[email protected] 。 : 654321,
13610002000 。 : 654321,
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
laravel에 yo에서 angularJs&coffeescript를 사용할 수 있도록 한다.먼저 yo 명령을 사용할 수 있어야하므로 아래에서 설치 global에 설치한 곳에서 laravel의 프로젝트 루트로 이동. 클라이언트 코드를 관리하는 디렉토리를 만들고 이동합니다. 클라이언트 환경 만들기 이것으로 히...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.