:) Tôi không muốn đưa ra giả thuyết và tranh luận về những gì nên làm với một cái gì đó. Trong trường hợp này đặc điểm. Tôi sẽ cho bạn thấy những gì tôi thấy những đặc điểm hữu ích và bạn có thể học hỏi từ nó hoặc bỏ qua nó.
Đặc điểm - chúng là tuyệt vời để áp dụng các chiến lược . Tóm lại, các mẫu thiết kế chiến lược rất hữu ích khi bạn muốn xử lý cùng một dữ liệu (được lọc, sắp xếp, v.v.).
Ví dụ: bạn có một danh sách các sản phẩm mà bạn muốn lọc dựa trên một số tiêu chí (nhãn hiệu, thông số kỹ thuật, bất cứ thứ gì) hoặc được sắp xếp theo các phương tiện khác nhau (giá, nhãn, bất cứ thứ gì). Bạn có thể tạo một đặc điểm sắp xếp có chứa các hàm khác nhau cho các loại sắp xếp khác nhau (số, chuỗi, ngày, v.v.). Sau đó, bạn có thể sử dụng đặc điểm này không chỉ trong lớp sản phẩm của mình (như được nêu trong ví dụ), mà còn trong các lớp khác cần các chiến lược tương tự (để áp dụng sắp xếp số cho một số dữ liệu, v.v.).
Thử nó:
<?php
trait SortStrategy {
private $sort_field = null;
private function string_asc($item1, $item2) {
return strnatcmp($item1[$this->sort_field], $item2[$this->sort_field]);
}
private function string_desc($item1, $item2) {
return strnatcmp($item2[$this->sort_field], $item1[$this->sort_field]);
}
private function num_asc($item1, $item2) {
if ($item1[$this->sort_field] == $item2[$this->sort_field]) return 0;
return ($item1[$this->sort_field] < $item2[$this->sort_field] ? -1 : 1 );
}
private function num_desc($item1, $item2) {
if ($item1[$this->sort_field] == $item2[$this->sort_field]) return 0;
return ($item1[$this->sort_field] > $item2[$this->sort_field] ? -1 : 1 );
}
private function date_asc($item1, $item2) {
$date1 = intval(str_replace('-', '', $item1[$this->sort_field]));
$date2 = intval(str_replace('-', '', $item2[$this->sort_field]));
if ($date1 == $date2) return 0;
return ($date1 < $date2 ? -1 : 1 );
}
private function date_desc($item1, $item2) {
$date1 = intval(str_replace('-', '', $item1[$this->sort_field]));
$date2 = intval(str_replace('-', '', $item2[$this->sort_field]));
if ($date1 == $date2) return 0;
return ($date1 > $date2 ? -1 : 1 );
}
}
class Product {
public $data = array();
use SortStrategy;
public function get() {
// do something to get the data, for this ex. I just included an array
$this->data = array(
101222 => array('label' => 'Awesome product', 'price' => 10.50, 'date_added' => '2012-02-01'),
101232 => array('label' => 'Not so awesome product', 'price' => 5.20, 'date_added' => '2012-03-20'),
101241 => array('label' => 'Pretty neat product', 'price' => 9.65, 'date_added' => '2012-04-15'),
101256 => array('label' => 'Freakishly cool product', 'price' => 12.55, 'date_added' => '2012-01-11'),
101219 => array('label' => 'Meh product', 'price' => 3.69, 'date_added' => '2012-06-11'),
);
}
public function sort_by($by = 'price', $type = 'asc') {
if (!preg_match('/^(asc|desc)$/', $type)) $type = 'asc';
switch ($by) {
case 'name':
$this->sort_field = 'label';
uasort($this->data, array('Product', 'string_'.$type));
break;
case 'date':
$this->sort_field = 'date_added';
uasort($this->data, array('Product', 'date_'.$type));
break;
default:
$this->sort_field = 'price';
uasort($this->data, array('Product', 'num_'.$type));
}
}
}
$product = new Product();
$product->get();
$product->sort_by('name');
echo '<pre>'.print_r($product->data, true).'</pre>';
?>
Là một lưu ý cuối cùng, tôi nghĩ về những đặc điểm như phụ kiện (mà tôi có thể sử dụng để thay đổi dữ liệu của mình). Các phương thức và thuộc tính tương tự có thể được cắt ra khỏi các lớp của tôi và được đặt vào một nơi duy nhất, để dễ bảo trì, mã ngắn hơn và sạch hơn.