Php設計モード:行動型モード(二)
原文詳細:http://www.ucai.cn/blogdetail/7023?mid=1&f=5
オンラインで実行して効果を見ることができますよ!
<続きます>
4、観察者モード(Observer):
パブリッシュサブスクリプションモードとも呼ばれ、1つのマスターオブジェクトが変更されると、それに依存する複数のオブジェクトが通知され、応答が自動的に更新されます.新聞社のように、今日発表されたニュースは、この新聞を読んでいる人が見ている限り同じ内容だ.別の新聞を発表すれば、同じです.
利点:放送式通信、範囲が広く、一呼百応し、グループを操作しやすく、「公有制」である.
弊害:グループ内の個体を単独で操作することができず、オンデマンドで分配することができない.
[シーンを適用](Apply Scene):複数のオブジェクトを操作し、同じ操作を行います.
コード実装:
5、仲介者モード(Mediator):
一連のオブジェクトインタラクションをブローカオブジェクトでカプセル化し、ブローカは各オブジェクトが明示的に相互参照する必要がないようにします.郵便局のように、郵送者や受取人は自分で遠くまで走る必要はなく、郵便局を通過すればいいです.
メリット:オブジェクト間の関係を簡素化し、サブクラスの生成を低減します.
弊害:仲介対象は非常に複雑になり、システムのメンテナンスが困難になる可能性があります.
≪シーンの適用|Apply Scene|emdw≫:表示せずにインタラクションを確立します.
コード実装:
6、状態モード(State):
オブジェクトは異なる状態で異なる動作を示す.彼女のように、喜んであなたの手を繋いで、犬の散歩をしません.2つの状態で異なる挙動が現れる.
メリット:if文の実用化を回避し、新しいステータスを追加しやすくし、ステータス変換ルールをカプセル化します.
弊害:システムクラスとオブジェクトの数を増やす.
[シーンを適用](Apply Scene):オブジェクトのさまざまな機能の変換に使用します.
コード実装:
優才ネット無料公開授業はここを押してください.http://www.ucai.cn/course5/
オンラインで実行して効果を見ることができますよ!
<続きます>
4、観察者モード(Observer):
パブリッシュサブスクリプションモードとも呼ばれ、1つのマスターオブジェクトが変更されると、それに依存する複数のオブジェクトが通知され、応答が自動的に更新されます.新聞社のように、今日発表されたニュースは、この新聞を読んでいる人が見ている限り同じ内容だ.別の新聞を発表すれば、同じです.
利点:放送式通信、範囲が広く、一呼百応し、グループを操作しやすく、「公有制」である.
弊害:グループ内の個体を単独で操作することができず、オンデマンドで分配することができない.
[シーンを適用](Apply Scene):複数のオブジェクトを操作し、同じ操作を行います.
コード実装:
<?php
/**
*
*
* Observer
*
* @author
* @see http://www.ucai.cn
*/
function output($string) {
echo $string . "
";
}
// , (Subject), ,
// Subject ,
class Order{
//
private $id = '';
// ID
private $userId = '';
//
private $userName = '';
//
private $price = '';
//
private $orderTime = '';
// ,
public function __set($name, $value){
if (isset($this->$name)){
$this->$name = $value;
}
}
//
public function __get($name){
if (isset($this->$name)){
return $this->$name;
}
return "";
}
}
// DB , ,
class FakeDB{
public function save($data){
return true;
}
}
class Client {
public static function test() {
//
$order = new Order();
$order->id = 1001;
$order->userId = 9527;
$order->userName = "God";
$order->price = 20.0;
$order->orderTime = time();
//
$db = new FakeDB();
$result = $db->save($order);
if ($result){
// ,
output( "[OrderId:{$order->id}] [UseId:{$order->userId}] [Price:{$order->price}]" );
// sendmail,
output( "Dear {$order->userName}: Your order {$order->id} was confirmed!" );
// sendmail,
output( "Dear Manager: User {$order->userName}(ID:{$order->userId}) submitted a new order {$order->id}, please handle it ASAP!" );
}
}
}
Client::test();
<?php
/**
*
*
* Observer
*
* @author
* @see http://www.ucai.cn
*/
function output($string) {
echo $string . "
";
}
// , (Subject), ,
// Subject ,
class Order{
//
private $id = '';
// ID
private $userId = '';
//
private $userName = '';
//
private $price = '';
//
private $orderTime = '';
// ,
public function __set($name, $value){
if (isset($this->$name)){
$this->$name = $value;
}
}
//
public function __get($name){
if (isset($this->$name)){
return $this->$name;
}
return "";
}
}
// ,
class OrderSubject implements SplSubject {
private $observers;
private $order;
public function __construct(Order $order) {
$this->observers = new SplObjectStorage();
$this->order = $order;
}
//
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 getOrder() {
return $this->order;
}
}
// (ActionLogObserver), Action( ),
class ActionLogObserver implements SplObserver{
public function update(SplSubject $subject) {
$order = $subject->getOrder();
// ,
output( "[OrderId:{$order->id}] [UseId:{$order->userId}] [Price:{$order->price}]" );
}
}
// (UserMailObserver)
class UserMailObserver implements SplObserver{
public function update(SplSubject $subject) {
$order = $subject->getOrder();
// sendmail,
output( "Dear {$order->userName}: Your order {$order->id} was confirmed!" );
}
}
// (AdminMailObserver)
class AdminMailObserver implements SplObserver{
public function update(SplSubject $subject) {
$order = $subject->getOrder();
// sendmail,
output( "Dear Manager: User {$order->userName}(ID:{$order->userId}) submitted a new order {$order->id}, please handle it ASAP!" );
}
}
// DB , ,
class FakeDB{
public function save($data){
return true;
}
}
class Client {
public static function test() {
//
$order = new Order();
$order->id = 1001;
$order->userId = 9527;
$order->userName = "God";
$order->price = 20.0;
$order->orderTime = time();
//
$subject = new OrderSubject($order);
$actionLogObserver = new ActionLogObserver();
$userMailObserver = new UserMailObserver();
$adminMailObserver = new AdminMailObserver();
$subject->attach($actionLogObserver);
$subject->attach($userMailObserver);
$subject->attach($adminMailObserver);
//
$db = new FakeDB();
$result = $db->save($order);
if ($result){
//
$subject->notify();
}
}
}
Client::test();
5、仲介者モード(Mediator):
一連のオブジェクトインタラクションをブローカオブジェクトでカプセル化し、ブローカは各オブジェクトが明示的に相互参照する必要がないようにします.郵便局のように、郵送者や受取人は自分で遠くまで走る必要はなく、郵便局を通過すればいいです.
メリット:オブジェクト間の関係を簡素化し、サブクラスの生成を低減します.
弊害:仲介対象は非常に複雑になり、システムのメンテナンスが困難になる可能性があります.
≪シーンの適用|Apply Scene|emdw≫:表示せずにインタラクションを確立します.
コード実装:
<?php
/**
*
*
* Mediator
*
* @author
* @see http://www.ucai.cn
*/
function output($string) {
echo $string . "
";
}
abstract class Mediator { //
abstract public function send($message,$colleague);
}
abstract class Colleague { //
private $_mediator = null;
public function __construct($mediator) {
$this->_mediator = $mediator;
}
public function send($message) {
$this->_mediator->send($message,$this);
}
abstract public function notify($message);
}
class ConcreteMediator extends Mediator { //
private $_colleague1 = null;
private $_colleague2 = null;
public function send($message,$colleague) {
if($colleague == $this->_colleague1) {
$this->_colleague1->notify($message);
} else {
$this->_colleague2->notify($message);
}
}
public function set($colleague1,$colleague2) {
$this->_colleague1 = $colleague1;
$this->_colleague2 = $colleague2;
}
}
class Colleague1 extends Colleague { //
public function notify($message) {
output(sprintf('Colleague-1: %s', $message));
}
}
class Colleague2 extends Colleague { //
public function notify($message) {
output(sprintf('Colleague-2: %s', $message));
}
}
class Client {
public static function test(){
// client
$objMediator = new ConcreteMediator();
$objC1 = new Colleague1($objMediator);
$objC2 = new Colleague2($objMediator);
$objMediator->set($objC1,$objC2);
$objC1->send("to c2 from c1");
$objC2->send("to c1 from c2");
}
}
Client::test();
6、状態モード(State):
オブジェクトは異なる状態で異なる動作を示す.彼女のように、喜んであなたの手を繋いで、犬の散歩をしません.2つの状態で異なる挙動が現れる.
メリット:if文の実用化を回避し、新しいステータスを追加しやすくし、ステータス変換ルールをカプセル化します.
弊害:システムクラスとオブジェクトの数を増やす.
[シーンを適用](Apply Scene):オブジェクトのさまざまな機能の変換に使用します.
コード実装:
<?php
/**
*
*
* State
*
* @author
* @see http://www.ucai.cn
*/
function output($string) {
echo $string . "
";
}
abstract class ILift {
//
const OPENING_STATE = 1; //
const CLOSING_STATE = 2; //
const RUNNING_STATE = 3; //
const STOPPING_STATE = 4; // ;
//
public abstract function setState($state);
//
public abstract function open();
// ,
public abstract function close();
// ,
public abstract function run();
//
public abstract function stop();
}
/**
*
*/
class Lift extends ILift {
private $state;
public function setState($state) {
$this->state = $state;
}
//
public function close() {
//
switch ($this->state) {
case ILift::OPENING_STATE: // ,
$this->setState(ILift::CLOSING_STATE);
break;
case ILift::CLOSING_STATE: // ,
//do nothing;
return ;
break;
case ILift::RUNNING_STATE: // , ,
//do nothing;
return ;
break;
case ILift::STOPPING_STATE: // , ,
//do nothing;
return ;
break;
}
output('Lift colse');
}
//
public function open() {
//
switch($this->state){
case ILift::OPENING_STATE: // ,
//do nothing;
return ;
break;
case ILift::CLOSING_STATE: // ,
$this->setState(ILift::OPENING_STATE);
break;
case ILift::RUNNING_STATE: // , ,
//do nothing;
return ;
break;
case ILift::STOPPING_STATE: // ,
$this->setState(ILift::OPENING_STATE);
break;
}
output('Lift open');
}
///
public function run() {
switch($this->state){
case ILift::OPENING_STATE: // , ,
//do nothing;
return ;
break;
case ILift::CLOSING_STATE: // ,
$this->setState(ILift::RUNNING_STATE);
break;
case ILift::RUNNING_STATE: // ,
//do nothing;
return ;
break;
case ILift::STOPPING_STATE: // ,
$this->setState(ILift::RUNNING_STATE);
}
output('Lift run');
}
//
public function stop() {
switch($this->state){
case ILift::OPENING_STATE: // , ,
//do nothing;
return ;
break;
case ILift::CLOSING_STATE: // ,
$this->setState(ILift::CLOSING_STATE);
break;
case ILift::RUNNING_STATE: // ,
$this->setState(ILift::CLOSING_STATE);
break;
case ILift::STOPPING_STATE: // ,
//do nothing;
return ;
break;
}
output('Lift stop');
}
}
class Client {
public static function test() {
$lift = new Lift();
//
$lift->setState(ILift::STOPPING_STATE);
// ,
$lift->open();
//
$lift->close();
// , ,
$lift->run();
// ,
$lift->stop();
}
}
Client::test();
<?php
/**
*
*
* State
*
* @author
* @see http://www.ucai.cn
*/
function output($string) {
echo $string . "
";
}
/**
*
*
*/
abstract class LiftState{
// ,
protected $_context;
public function setContext(Context $context){
$this->_context = $context;
}
//
public abstract function open();
// ,
public abstract function close();
// ,
public abstract function run();
// ,
public abstract function stop();
}
/**
* : 。 ConcreteState , 。
*/
class Context {
//
static $openningState = null;
static $closeingState = null;
static $runningState = null;
static $stoppingState = null;
public function __construct() {
self::$openningState = new OpenningState();
self::$closeingState = new ClosingState();
self::$runningState = new RunningState();
self::$stoppingState = new StoppingState();
}
//
private $_liftState;
public function getLiftState() {
return $this->_liftState;
}
public function setLiftState($liftState) {
$this->_liftState = $liftState;
//
$this->_liftState->setContext($this);
}
public function open(){
$this->_liftState->open();
}
public function close(){
$this->_liftState->close();
}
public function run(){
$this->_liftState->run();
}
public function stop(){
$this->_liftState->stop();
}
}
/**
*
*/
class OpenningState extends LiftState {
/**
* ,
*
*/
public function close() {
//
$this->_context->setLiftState(Context::$closeingState);
// CloseState
$this->_context->getLiftState()->close();
}
//
public function open() {
output('lift open...');
}
// , , !
public function run() {
//do nothing;
}
// ?
public function stop() {
//do nothing;
}
}
/**
* ,
*/
class ClosingState extends LiftState {
// ,
public function close() {
output('lift close...');
}
// , ,
public function open() {
$this->_context->setLiftState(Context::$openningState); //
$this->_context->getLiftState()->open();
}
// ,
public function run() {
$this->_context->setLiftState(Context::$runningState); // ;
$this->_context->getLiftState()->run();
}
// ,
public function stop() {
$this->_context->setLiftState(Context::$stoppingState); // ;
$this->_context->getLiftState()->stop();
}
}
/**
*
*/
class RunningState extends LiftState {
// ?
public function close() {
//do nothing
}
// ? !
public function open() {
//do nothing
}
//
public function run() {
output('lift run...');
}
// , ?!
public function stop() {
$this->_context->setLiftState(Context::$stoppingState); // ;
$this->_context->getLiftState()->stop();
}
}
/**
*
*/
class StoppingState extends LiftState {
// ? !
public function close() {
//do nothing;
}
// , , !
public function open() {
$this->_context->setLiftState(Context::$openningState);
$this->_context->getLiftState()->open();
}
// ,
public function run() {
$this->_context->setLiftState(Context::$runningState);
$this->_context->getLiftState()->run();
}
// ?
public function stop() {
output('lift stop...');
}
}
/**
*
*/
class Client {
public static function test() {
$context = new Context();
$context->setLiftState(new ClosingState());
$context->open();
$context->close();
$context->run();
$context->stop();
}
}
Client::test();
優才ネット無料公開授業はここを押してください.http://www.ucai.cn/course5/