设计模式-strategy

策略模式

模式一

主方法只写要比较的参与者和Sort这件事情

public class Main {
    public static void main(String[] args) {
        Sorter sorter = new Sorter();
        Dog[] dogs = {new Dog(1),new Dog(2),new Dog(3)};
        Cat[] cats = {new Cat(1,10),new Cat(12,20),new Cat(3,5)};
        sorter.sort(dogs);
        System.out.println(Arrays.toString(dogs));
        sorter.sort(cats);
        System.out.println(Arrays.toString(cats));
    }
}

比较器

public class Sorter<T> {
    public void sort(Comparable[] arr){
        for(int i=0;i<arr.length;i++){
            int minPos = i;
            for(int j=i+1;j<arr.length;j++){
                minPos = arr[j].compareTo(arr[minPos])==-1 ? j : minPos;
            }
            swap(arr,i,minPos);
        }
    }

    void swap(Comparable[] arr,int i,int minPos){
        Comparable temp = arr[i];
        arr[i] = arr[minPos];
        arr[minPos] = temp;
    }
}

被比较的对象,自带实现比较的具体方法

public interface Comparable {
    int compareTo(Object o1);
}
public class Cat implements Comparable{
    int height;
    int weight;
    @Override
    public int compareTo(Object o) {
        Cat c = (Cat)o;
        if(c.height>this.height){
            return -1;
        }else if(c.height<this.height){
            return 1;
        }else {
            return 0;
        }
    }
public class Dog implements Comparable {
    int food;
    @Override
    public int compareTo(Object o1) {
        Dog d = (Dog)o1;
        if (this.food > d.food) {
            return -1;
        }
        else if(this.food > d.food) {
            return 1;
        }
        else {
            return 0;
        }
    }
}

修改关闭,扩展开放原则:
这个模式的缺点是,比较方式单一,比较固定,不够灵活,如果想比较一个Cat中的多个属性,此时只能修改compareTo接口,或者新增一个新接口,采用下面的模式升级版,可以把比较的方式也多样化

模式二

目标: 要求比较策略灵活处理,增加一个cat类的height的排序

public static void main(String[] args) {
        Sorter sorter = new Sorter();
        Dog[] dogs = {new Dog(10),new Dog(2),new Dog(3)};
        Cat[] cats = {new Cat(1,10),new Cat(12,1),new Cat(3,5)};
        
        Sorter2<Dog> sorter2 = new Sorter2();
        sorter2.sort(dogs,new DogComparator());
        System.out.println(Arrays.toString(dogs));

        Sorter2<Cat> sorter21 = new Sorter2();
        sorter21.sort(cats,new CatHeightComparator());
        System.out.println("height "+Arrays.toString(cats));

        sorter21.sort(cats,new CatWeightComparator());
        System.out.println("weight "+Arrays.toString(cats));
    }
public class Sorter2<T> {
    public void sort(T[] arr, Comparator<T> comparator){
        for(int i=0;i<arr.length;i++){
            int minPos = i;
            for(int j=i+1;j<arr.length;j++){
                minPos = comparator.compare(arr[j],arr[minPos])==-1 ? j : minPos;
            }
            swap(arr,i,minPos);
        }
    }

    void swap(T[] arr,int i,int minPos){
        T temp = arr[i];
        arr[i] = arr[minPos];
        arr[minPos] = temp;
    }
}

new一个的比较策略接口

public interface Comparator<T> {
    int compare(T o1,T o2);
}

每想要实现某个对象的某种维度的排序,就增加一个XXX的比较器的实现,这样就不用修改原有的代码,又有了横向拓展能力

下面是增加Cat的height的sort
public class CatHeightComparator implements Comparator<Cat> {
    @Override
    public int compare(Cat o1, Cat o2) {
        if (o1.height>o2.height) {
            return -1;
        }
        else if(o1.height>o2.height){
            return 1 ;
        }
        else {
            return 0;
        }
    }
}
下面是增加Cat的weight的sort
public class CatWeightComparator implements Comparator<Cat> {
    @Override
    public int compare(Cat o1, Cat o2) {
        if (o1.weight>o2.weight) {
            return -1;
        }
        else if(o1.weight>o2.weight){
            return 1 ;
        }
        else {
            return 0;
        }
    }
}
public class DogComparator implements Comparator<Dog> {
    @Override
    public int compare(Dog o1, Dog o2) {
        if(o1.food>o2.food){
            return -1;
        }else if(o1.food<o2.food){
            return 1;
        }else {
            return 0;
        }
    }
}

参考
https://www.bilibili.com/video/BV1RC4y1H7ok?p=4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值