设计模式-策略模式

策略模式(定义一系列的算法,把每一个算法封装起来,并且可相互替换使用)


一、对策略模式的理解

策略一词可理解为古代行军打仗,面对不同的敌人采用不同的方法,例如针对弓箭手可以用盾兵应对。

在架构设计之中策略可以为每年会有618、双11、38女神节等等活动,针对同一件商品都会采用不同的价格计算,而采用不同的优惠方式。(采用本人实际开发用到的场景进行举例,只是举例,具体开发里用到的设计方式后面还会说到一些,大家有更好的例子可以写在评论里)

 


二、策略模式的优缺点

此模式的优缺点我会先列举出来,然后添加代码进行举例

优点:最大的优点就是解耦,如果不采用这种方式,编写代码时就需要多个判断,根据日期去判断选择哪种优惠方式,如果活动日期太过密集,就需要很多判断。采用这种方式,当增加活动或者优惠方式时,只需要新增方法并去实现策略接口即可,不需要修改已有的(开闭原则)

缺点:会出现很多的策略类(到时候用哪个得记住啊),策略相关的类都会实现策略接口,初始化之后会有很多用不到,浪费空间。

代码:

代码会从三个部分去理解整个模式,其实是有专业的术语(环境、抽象策略角色、具体策略角色),但是我会用大白话去说一下自己的理解

1、比较大小(抽象策略角色,提供比较方法)

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

    default void m() {
        System.out.println("m");
    }
}

2、具体的比较方法(具体策略角色,实现接口,写里面怎样比较)

public class IntegerComparator implements Comparator<Integer> {
    @Override
    public int compare(Integer o1, Integer o2) {
        if(o1 < o2) return -1;
        else if (o1 > o2) return 1;
        else return 0;
    }
}


public class DoubleComparator implements Comparator<Double> {
    @Override
    public int compare(Double o1, Double o2) {
        if(o1 < o2) return -1;
        else if (o1 > o2) return 1;
        else return 0;
    }
}

3、根据情况使用哪一种(具体策略角色,根据比较大小的数字的类型运用具体的策略)

public class Main {
    public static void main(String[] args) {
        Comparator comparator = new DoubleComparator();
        System.out.println(comparator.compare(2.1,2.0));
        Comparator comparator2 = new IntegerComparator();
        System.out.println(comparator2.compare(1,2));
    }
}

三、策略模式的应用及注意事项

1、多个类只有算法稍有不同的时候

2、算法可以自由更改(具体的算法规则要屏蔽掉)

实际应用:Java AWT中的LayoutManager(布局管理器)

注意事项:一个系统的策略大于四个的时候,需要考虑结合其他设计模式解决策略类膨胀的问题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值