策略模式实践

有这样一个类:

要求:假如有若干个类Person对象存在一个List当中,对他们进行排序,分别按照名字、年龄、id 进行排序(要有正序与倒序两种排序方式)。假如年龄或者姓名重复,按照id的正序进行排序。要求使用策略模式进行。

public class Person {

    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

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

    public Person(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name=‘" + name + ‘\‘‘ +
                ", age=" + age +
                ‘}‘;
    }
}
public interface Sorter {
    void sort(List<Person> list);
}
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 按照Person类的Id属性的升序进行排序。
 */
public class SortByIdAsc implements Sorter {
    /**
     * 使用Collections类中的sort方法进行排序,使用自定义的比较器。
     * public static <T> void sort(List<T> list, Comparator<? super T> c)
     */
    @Override
    public void sort(List<Person> list) {
        Collections.sort(list, new MyComparator());

    }

    /**
     * 自定义比较器,按照Person类的ID属性排序。
     */
    class MyComparator implements Comparator<Person>{
        @Override
        public int compare(Person person1, Person person2) {
            return person1.getId() - person2.getId();
        }
    }
}
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 按照Person类的Id属性的降序进行排序。
 */
public class SortByIdDesc implements Sorter{
    /**
     * 使用Collections类中的sort方法进行排序,使用自定义的比较器。
     * public static <T> void sort(List<T> list, Comparator<? super T> c)
     */
    @Override
    public void sort(List<Person> list) {
        Collections.sort(list, new MyComparator());

    }

    /**
     * 自定义比较器,按照Person类的ID属性排序。
     */
    class MyComparator implements Comparator<Person> {
        @Override
        public int compare(Person person1, Person person2) {
            return person2.getId() - person1.getId();
        }
    }
}
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 按照Person类的name属性的升序进行排序,在name相同的情况下按照id的升序进行排序。
 */
public class SortByNameAsc implements Sorter{
    /**
     * 使用Collections类中的sort方法进行排序,使用自定义的比较器。
     * public static <T> void sort(List<T> list, Comparator<? super T> c)
     */
    @Override
    public void sort(List<Person> list) {
        Collections.sort(list, new MyComparator());
    }
    /**
     * 自定义比较器,按照Person类的name属性按照字典顺序升序排序,name相同按照id的升序排序。
     */
    class MyComparator implements Comparator<Person> {

        @Override
        public int compare(Person p1, Person p2) {
            String p1Name = p1.getName();
            String p2Name = p2.getName();
            if(p1Name.equals(p2Name)){
                return p1.getId() - p2.getId();
            }
            return p1Name.compareTo(p2Name);
        }
    }
}
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 按照Person类的name属性的降序进行排序,在name相同的情况下按照id的升序进行排序。
 */
public class SortByNameDesc implements Sorter {
    /**
     * 使用Collections类中的sort方法进行排序,使用自定义的比较器。
     * public static <T> void sort(List<T> list, Comparator<? super T> c)
     */
    @Override
    public void sort(List<Person> list) {
        Collections.sort(list, new MyComparator());
    }
    /**
     * 自定义比较器,按照Person类的name属性按照字典顺序降序排序,name相同按照id的升序排序。
     */
    class MyComparator implements Comparator<Person> {

        @Override
        public int compare(Person p1, Person p2) {
            String p1Name = p1.getName();
            String p2Name = p2.getName();
            if(p1Name.equals(p2Name)){
                return p1.getId() - p2.getId();
            }
            return p2Name.compareTo(p1Name);
        }
    }
}
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 按照Person类的age属性的升序进行排序,age相同时按照id的升序排序
 */
public class SortByAgeAsc implements Sorter {
    /**
     * 使用Collections类中的sort方法进行排序,使用自定义的比较器。
     * public static <T> void sort(List<T> list, Comparator<? super T> c)
     */
    @Override
    public void sort(List<Person> list) {
        Collections.sort(list, new MyComparator());

    }

    /**
     * 自定义比较器,按照Person类的age属性升序排序。
     */
    class MyComparator implements Comparator<Person> {
        @Override
        public int compare(Person person1, Person person2) {
            int p1Age = person1.getAge();
            int p2Age = person2.getAge();
            if (p1Age == p2Age) {
                return person1.getId() - person2.getId();
            }
            return p1Age - p2Age;
        }
    }
}
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 按照Person类的age属性的降序进行排序,age相同时按照id的升序排序.
 */
public class SortByAgeDesc implements Sorter {
    /**
     * 使用Collections类中的sort方法进行排序,使用自定义的比较器。
     * public static <T> void sort(List<T> list, Comparator<? super T> c)
     */
    @Override
    public void sort(List<Person> list) {
        Collections.sort(list, new MyComparator());

    }

    /**
     * 自定义比较器,按照Person类的age属性升序排序。
     */
    class MyComparator implements Comparator<Person> {
        @Override
        public int compare(Person person1, Person person2) {
            int p1Age = person1.getAge();
            int p2Age = person2.getAge();
            if (p1Age == p2Age) {
                return person1.getId() - person2.getId();
            }
            return p2Age - p1Age;
        }
    }
}
时间: 2024-11-12 17:16:12

策略模式实践的相关文章

JavaScript设计模式与开发实践---读书笔记(5) 策略模式

策略模式的定义是:定义一系列的算法,把它们一个个封转起来,并且使它们可以相互替换. JavaScript版本的策略模式: 奖金系统: var strategies = { "S": function(salary){ return salary*4; }, "A": function(salary){ return salary*3; }, "B": function(salary){ return salary*2; } }; var calc

Javascript设计模式与开发实践详解(二:策略模式) http://www.jianshu.com/p/ef53781f6ef2

上一章我们介绍了单例模式及JavaScript惰性单例模式应用这一次我主要介绍策略模式策略模式是定义一系列的算法,把它们一个个封装起来,并且让他们可以互相替换.比方说在现实中很多时候也有很多途径到达同一个目的地,比如我们去某个地方旅游,可以选择坐飞机,乘火车,骑自行车等方式. 使用策略模式计算奖金 很多公司的年终奖是根据员工的工资基数和年底绩效来发放的.例如,绩效为 S 的人年终奖有4倍工资,绩效为 A 的人年终奖有3倍工资,绩效为 B 的人年终奖有2倍工资.现在我们来计算员工的年终奖. var

javascript设计模式与开发实践阅读笔记(5)——策略模式

策略模式:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换. 我的理解就是把各种方法封装成函数,同时存在一个可以调用这些方法的公共函数.这样做的好处是可以消化掉内部的分支判断,使代码效率更高. 使用策略模式计算奖金 现在要实现这样一个东西,年终奖是根据员工的工资基数和年底绩效情况来发放的.例如,绩效为S的人年终奖有4倍工资,绩效为A的人年终奖有3倍工资,而绩效为B的人年终奖是2倍工资.假设财务部要求我们提供一段代码,来方便他们计算员工的年终奖. 思路一:创建一个函数,接收两个参数,

《JavaScript设计模式与开发实践》—— 策略模式

策略模式的定义是: 定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换. (1) 使用策略模式计算奖金 经过思考,我们想到了更好的办法--使用策略模式来重构代码.策略模式指的是定义一系列的算法,把它们一个个封装起来.将不变的部分和变化的部分隔开是每个设计模式的主题,策略模式也不例外,策略模式的目的就是将算法的使用与算法的实现分离开来. 一个基于策略模式的程序至少由两部分组成.第一个部分是一组策略类,策略类封装了具体的算法,并负责具体的计算过程. 第二个部分是环境类 Context,

策略模式的孪生兄弟——对状态模式的深度复习总结

俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的总结知识点如下: 和策略模式的比较 状态模式概念和例子 应用场景 责任链模式和状态模式对比 一种代码优化的思路 java.util.Iterator里也有状态模式的影子 状态模式的优缺点 有限状态机及其应用 前面有总结——策略模式,之前早就觉得策略和状态设计模式有一些相似…… 接口的常用用法都有什么?策略设计模式复习总结 我知道策略模式是对象的行为模式,其实就是对一系列级别平等的算法的封装,它不关心算法实现,让客户端去动态的

深入理解JavaScript系列(33):设计模式之策略模式(转)

介绍 策略模式定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户. 正文 在理解策略模式之前,我们先来一个例子,一般情况下,如果我们要做数据合法性验证,很多时候都是按照swith语句来判断,但是这就带来几个问题,首先如果增加需求的话,我们还要再次修改这段代码以增加逻辑,而且在进行单元测试的时候也会越来越复杂,代码如下: validator = { validate: function (value, type) { switch (type) { c

02—策略模式

描述:是用来封装算法的,但在实践中,我们发现可以用来封装任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性. 简单说就是“策略模式封装了变化”. 实例:用一个超市促销活动收银的小例了来讲解一下,比如双11了,我们的超市要举行促销活动,活动类型分类:正常收费.满300返100.打8折三种. 那我们先分析一下,三种收费方式,每种的计算方式都不同,有很多种实现方式,我们先用简单工厂实现,然后在用策略模式实现,好下面我们先用简单工厂实现一下:

小菜学设计模式——策略模式

背景 同一个问题,总是有许多中解决问题的办法,如何才能让这些办法同时存在而又互不干扰呢?就可以使用策略模式. 1.使用意图 策略模式:它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户端. 意图很明确,对一种问题可以有多种解决方式,而这些解决方式都是互不干扰,但他们又属于同一个家族. 2.生活实例 商场促销商品,然而促销商品的策略多种多样,比如买一送一.满100奖50.两件88折等,这些策略都是同属于商品的促销策略家族,但是他们之间的算法是互不干

工厂模式与策略模式之区别

设计模式有很多种,其中功能相似的很多,但是为什么还要分这么多种名字,查阅资料,我觉得下面的解释最为合理:用途不一样,名字就有区别,一把斧头用来砍人就叫凶器,用来砍柴就叫伐木斧,用来劈门就叫消防斧,这些模式的名字都是根据具体使用时的场景,联系了现实里某样东西或某种习惯而取得,所以很相似的模式行为有不同叫法. 今天我们就来研究一些工厂模式与策略模式的一些区别: 工厂模式是创建型模式,适应对象的变化. 策略模式是行为性模式,适应行为的变化 工厂模式封装对象,实例化对象后调用的时候要知道具体的方法,策略