參考於 : 大話設計模式 馬士兵設計模式視頻 1.場景介紹 購物網站上有一個產品,有三個欄位,檔次,價格,重量。 有些同學喜歡輕的,有些手頭緊,想要便宜的,有些喜歡檔次高的。 那麼我們為了提高網站用戶體驗,必須給六個按鈕,按照價格升序降序,按照檔次升序降序,按照重量升序降序。 (這裡只是打個比方,好 ...
參考於 :
大話設計模式
馬士兵設計模式視頻
1.場景介紹
購物網站上有一個產品,有三個欄位,檔次,價格,重量。
有些同學喜歡輕的,有些手頭緊,想要便宜的,有些喜歡檔次高的。
那麼我們為了提高網站用戶體驗,必須給六個按鈕,按照價格升序降序,按照檔次升序降序,按照重量升序降序。
(這裡只是打個比方,好像一般遇到這種情況是用Lucenc)
2.不用策略模式
package com.dingyu;
import java.util.Arrays;
/**
* 產品類,這裡為了代碼代碼儘可能的少,set get方法沒加
* Comparable介面中有一個compareTo方法,這個方法進行兩個對象比較
* Arrays.sort內部方法用到了這個compareTo方法
* 這樣以後只要我的類實現了Comparable介面,排序的代碼可以通用(Arrays.sort())去排序,可以自定義比較規則,
*
* @author dingyu
*
*/
public class Product implements Comparable<Product> {
private double quality;
private double price;
private int weight;
public Product(double quality, double price, int weight) {
this.quality = quality;
this.price = price;
this.weight = weight;
}
@Override
public int compareTo(Product product) {
if (this.price > product.price)
return 1;
else if (this.price == product.price)
return 0;
else
return -1;
}
@Override
public String toString() {
return "價格 " + price + " 重量:" + weight + " 檔次:" + quality;
}
public static void main(String[] args) {
Product[] people = { new Product(2, 500, 50), new Product(3, 1000, 60), new Product(1, 200, 70) };
Arrays.sort(people);
for (int i = 0; i < people.length; i++) {
System.out.println(people[i]);
}
}
}
JDK 源碼:
缺點:把compareTo邏輯寫死了,如果要改,需要修改compareTo里的邏輯。違反開閉原則。
3.使用策略模式
使用一個介面,每個策略都實現這個介面
package com.dingyu;
public interface Comparator<T> {
public int compare(T t1,T t2);
}
package com.dingyu;
public class CompareHeight implements Comparator<Product> {
@Override
public int compare(Product t1, Product t2) {
if (t1.getPrice() > t2.getPrice())
return 1;
else if (t1.getPrice() == t2.getPrice())
return 0;
else
return -1;
}
}
package com.dingyu;
public class CompareQunatity implements Comparator<Product>{
@Override
public int compare(Product t1, Product t2) {
if (t1.getQuality() > t2.getQuality())
return 1;
else if (t1.getQuality() == t2.getQuality())
return 0;
else
return -1;
}
}
package com.dingyu;
public class CompareWeight implements Comparator<Product> {
@Override
public int compare(Product t1, Product t2) {
if (t1.getWeight() > t2.getWeight())
return 1;
else if (t1.getWeight() == t2.getWeight())
return 0;
else
return -1;
}
}
package com.dingyu;
import java.util.Arrays;
/**
* 產品類,這裡為了代碼代碼儘可能的少,set get方法沒加 Comparable介面中有一個compareTo方法,這個方法進行兩個對象比較
* Arrays.sort內部方法用到了這個compareTo方法
* 這樣以後只要我的類實現了Comparable介面,排序的代碼可以通用(Arrays.sort())去排序,可以自定義比較規則,
*
* @author dingyu
*
*/
public class Product implements Comparable<Product> {
private double quality;
private double price;
private int weight;
private static Comparator<Product> comparator;
public Product(double quality, double price, int weight) {
this.quality = quality;
this.price = price;
this.weight = weight;
}
public double getQuality() {
return quality;
}
public void setQuality(double quality) {
this.quality = quality;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public static Comparator<Product> getComparator() {
return comparator;
}
public static void setComparator(Comparator<Product> comparator) {
Product.comparator = comparator;
}
@Override
public int compareTo(Product product) {
return comparator.compare(this, product);
}
@Override
public String toString() {
return "價格 " + price + " 重量:" + weight + " 檔次:" + quality;
}
public static void main(String[] args) {
Product[] products = { new Product(2, 500, 50), new Product(3, 1000, 60), new Product(1, 200, 70) };
Product.setComparator(new CompareHeight());
Arrays.sort(products);
for (int i = 0; i < people.length; i++) {
System.out.println(people[i]);
}
}
}