シナリオ: PHP データ インターフェイスを作成し、データを XML 形式で返します。
これが私たちが通常それを書く方法です。
class Data{ private $_data = array(); public function __construct( $data ){ $this -> data = $data; } public function formatXml( $data ){ $xml = '<?xml version="1.0" encoding="utf-8"?>'; $xml .= '<return>'; $xml .= '<data>' .serialize($return_data). '</data>'; $xml .= '</return>'; return $xml; } //返回xml数据 public function getXml(){ // 怎样把数据处理成xml就不写了 return $this -> formatXml($this -> _data); }}$data = new Data( array('title' => 'Strategy', 'language' => 'PHP') );echo $data -> getXml();
それでは、今回はニーズが変わったのですが、どう対処すればよいでしょうか。最も簡単な方法は、getJson メソッドを Data クラスに追加することです。問題は解決しましたが、前に話したデザイン パターンの原則を覚えていますか? はい、それは開閉の原則に違反していました。拡張の場合は開き、変更の場合は閉じます。 Data クラスの役割は複雑すぎるため、単一責任の原則に違反しています。それから、方法を見つけなければなりません。
class Data{ private $_data = array(); public function __construct( $data ){ $this -> _data = $data; } // public function getData( IFormat $format ){ $format -> formatData( $this -> _data ); }}interface IFormat{ public function formatData();}class Json implements IFormat{ public function formatData( $data ){ return json_encode( $data ); }}class Xml implements IFormat{ public function formatData( $data ){ $xml = '<?xml version="1.0" encoding="utf-8"?>'; $xml .= '<return>'; $xml .= '<data>' .serialize($return_data). '</data>'; $xml .= '</return>'; return $xml; }}$data = new Data( array('title' => 'Strategy', 'language' => 'PHP') )$data -> getData( new Json() ); //获取Json格式$data -> getData( new Xml() ); //获取xml格式....//随便扩展
戦略パターン: クラス自体 (Data) には処理戦略 (formatData) が含まれておらず、異なる戦略オブジェクト (xml および Json) を呼び出して、異なる戦略アルゴリズムを実装できます。