欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java设计模式---Strategy策略模式

程序员文章站 2022-12-23 08:02:37
参考于 : 大话设计模式 马士兵设计模式视频 1.场景介绍 购物网站上有一个产品,有三个字段,档次,价格,重量。 有些同学喜欢轻的,有些手头紧,想要便宜的,有些喜欢档次高的。 那么我们为了提高网站用户体验,必须给六个按钮,按照价格升序降序,按照档次升序降序,按照重量升序降序。 (这里只是打个比方,好 ......

参考于 :

  大话设计模式

  马士兵设计模式视频

  Java设计模式---Strategy策略模式

Java设计模式---Strategy策略模式

 

 

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 源码:

Java设计模式---Strategy策略模式

   缺点:把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]);
        }
    }
}