JAVA Strategy策略模式

策略模式

  1. 当使一项功能要使用多种算法(可抽象成同类的算法)进行计算时,可利用多态,通过共同的接口动态地选择不同策略算法。
  2. 可以避免业务中使用不同策略算法时,写成多个If…else…。
  3. 适合结合责任链模式使用。

构建过程

  1. 抽象接口。
    将不同的处理策略算法,抽象出共性(输入、输出等),定义到相同的接口方法中。
  2. 实现多种策略类。
    基于共同的接口,根据需求定义并实现多种策略类。
  3. 使用策略。
    当要使用某策略时(例如策略X),定义接口引用,指向策略X类实例化对象。
    进行计算的业务方法中只需通过接口传递对应的策略X类,和策略X类要计算的数据即可。

场景及使用

  • 业务功能可根据不同的实现类动态地选择不同的算法。
    简单例子:业务功能是判断对象大小,那么猫和狗两个不同类,需要使用不同的判断策略。假设狗比较大小是按尾巴长度。猫比较大小的算法是按年龄。😁😁😁那么可以基于Comparator接口实现两种策略算法,完成业务计算。

猫类

public class Cat {
    public String name;
    public int age;

    Cat(String name,int age)
    {
        this.age = age;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Cat{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

狗类

public class Dog {
    public String name;
    public int tail;

    Dog(String name,int tail)
    {
        this.tail = tail;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", tail=" + tail +
                '}';
    }
}

猫狗不同的策略类

public class CatStrategy implements Comparator<Cat> {
    @Override
    public int compare(Cat o1, Cat o2) {
        if(o1.age > o2.age) return 1;
        else if (o1.age < o2.age) return -1;
        else return 0;
    }
}
public class DogStrategy implements Comparator<Dog> {
    @Override
    public int compare(Dog o1, Dog o2) {
        if(o1.tail > o2.tail) return 1;
        else if (o1.tail < o2.tail) return -1;
        else return 0;
    }
}

主方法

public class Strategy_v1 {
    //定义比较猫的策略
    static Comparator cat_strategy = new CatStrategy();

    //定义比较狗的策略
    static Comparator dog_strategy = new DogStrategy();
    public static void main(String[] args) {
        Cat c1 = new Cat("Mimi",20);
        Cat c2 = new Cat("OldDriver",40);
        //调用通用业务方法
        BusinessMethod(cat_strategy,c1,c2);

        Dog d1 = new Dog("WangWang",1);
        Dog d2 = new Dog("LongTailer",3);
        //调用通用业务方法
        BusinessMethod(dog_strategy,d1,d2);

    }

    //业务方法中只需要传递 策略类,计算对象
    public static void BusinessMethod(Comparator strategy, Object o1,Object o2)
    {
       if(strategy.compare(o1,o2) > 0) System.out.println("Bigger is " + o1.toString());
       else if(strategy.compare(o1,o2) < 0) System.out.println("Bigger is " + o2.toString());
       else  System.out.println("Equal !");
    }
}

顺便比较下comparator和comparable接口

  • Comparable
  1. 位于lang包下,就一个接口方法CompareTo;
  2. 用于和另一个同类对象比较,实现自然排序;
  3. 接口需要侵入到“比较对象类”的内部实现,耦合性强!
  • Comparator
  1. 位于Util包下,接口方法Compare(T o1, T o2),Java 1.8后增加了很多default方法。
  2. 可实现类中两个对象的比较。当对Comparable自然排序不满意时,可实现自己的比较算法,实现排序逻辑。
  3. 不需要侵入到“比较对象类”内部实现,可在任意类中实现Compare方法,相比Comparable耦合性低,可用于策略模式。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值