Java设计模式---Strategy策略模式
程序员文章站
2022-05-18 18:20:26
参考于 : 大话设计模式 马士兵设计模式视频 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]); } } }
上一篇: 行为模式之访问者模式