策略设计模式

我们怎么比较两个对象,取出每一个值进行比较也行,但是写出的代码不优雅,还记得我们学过的equals方法吗?

我们既然能做等值比较,为什么不能做大小的比较呢?

User类


    public void setUsername(String username) {
        this.username = username;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Double getHeight() {
        return height;
    }

    public void setHeight(Double height) {
        this.height = height;
    }


    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", age=" + age +
                ", height=" + height +
                '}';
    }
}

比较接口

public interface Comparator {
    Integer compare(User user, User user1);
}

比较年龄的策略——User也不需要直接实现某些接口

public class CompareAgeStrategy implements Comparator {

    public Integer compare(User user, User user1) {
        return user.getAge() - user1.getAge();
    }

}

比较身高的策略

public class CompareHeightStrategy implements Comparator {

    public Integer compare(User user, User user1) {
        return (int)(user.getHeight() - user1.getHeight());
    }
}

排序

public class UserSorter {

    // Comparator comparator:传的是接口!!!
    public void sort(User users[], Comparator comparator) {
        // 冒泡排序
        for (int i = 0; i < users.length - 1; i++) {
            for (int j = 0; j < users.length - i - 1; j++) {
                if (comparator.compare(users[j], users[j + 1]) > 0) {
                    User temp = users[j];
                    users[j] = users[j + 1];
                    users[j + 1] = temp;
                }
            }
        }
    }
    
}

客户端

import java.util.Arrays;

public class Client {
    public static void main(String[] args) {
        User user1 = new User("小王", 12, 153.4);
        User user2 = new User("小李", 14, 163.4);
        User user3 = new User("小张", 13, 123.4);
        User user4 = new User("小杨", 4, 6.4);

        User[] users = {user1, user2, user3, user4};

        UserSorter userSorter = new UserSorter();

        userSorter.sort(users, new CompareAgeStrategy());
        // 打印一个数组
        System.out.println(Arrays.toString(users));

        // 客户端想怎么排序,到时候 new 一个策略就完了
        userSorter.sort(users, new CompareHeightStrategy());
        System.out.println(Arrays.toString(users));
        
    }
}

运行结果:

[User{username='小杨', age=4, height=6.4}, User{username='小王', age=12, height=153.4}, User{username='小张', age=13, height=123.4}, User{username='小李', age=14, height=163.4}]

[User{username='小杨', age=4, height=6.4}, User{username='小张', age=13, height=123.4}, User{username='小王', age=12, height=153.4}, User{username='小李', age=14, height=163.4}]



 

优化——箭头函数

@FunctionalInterface
public interface Comparator {
    Integer compare(User user, User user1);
}
import java.util.Arrays;

public class Client {
    public static void main(String[] args) {
        User user1 = new User("小王", 12, 153.4);
        User user2 = new User("小李", 14, 163.4);
        User user3 = new User("小张", 13, 123.4);
        User user4 = new User("小杨", 4, 6.4);

        User[] users = {user1, user2, user3, user4};

        UserSorter userSorter = new UserSorter();

/*        userSorter.sort(users, new CompareAgeStrategy());*/

/*
        userSorter.sort(users, new Comparator() {
            @Override
            public Integer compare(User user, User user1) {
                return user.getAge() - user1.getAge();
            }
        });
        */

        userSorter.sort(users, 
            (user, otherUser) -> user.getAge() - user1.getAge()
        );


        // 打印一个数组
        System.out.println(Arrays.toString(users));

        // 客户端想怎么排序,到时候 new 一个策略就完了
        userSorter.sort(users, new CompareHeightStrategy());
        System.out.println(Arrays.toString(users));

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值