策略模式(Strategy Pattern)

策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列的算法,并将每个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户端。以下从多个方面详细介绍策略模式。

模式结构与角色

策略模式主要包含以下几个角色:

  1. 策略接口(Strategy):定义了所有具体策略类必须实现的公共接口,通常包含一个或多个抽象方法,这些方法代表了算法的行为。
  2. 具体策略类(Concrete Strategy):实现了策略接口,提供了具体的算法实现。每个具体策略类封装了一种特定的算法。
  3. 上下文类(Context):维护一个对策略接口的引用,负责根据客户端的需求选择并使用具体的策略。上下文类将具体的算法委托给具体策略类来执行。

代码示例

以下是一个简单的策略模式示例,模拟一个购物系统中的不同折扣策略:

// 策略接口:折扣策略
interface DiscountStrategy {
    double applyDiscount(double price);
}

// 具体策略类:无折扣策略
class NoDiscountStrategy implements DiscountStrategy {
    @Override
    public double applyDiscount(double price) {
        return price;
    }
}

// 具体策略类:10% 折扣策略
class TenPercentDiscountStrategy implements DiscountStrategy {
    @Override
    public double applyDiscount(double price) {
        return price * 0.9;
    }
}

// 具体策略类:20% 折扣策略
class TwentyPercentDiscountStrategy implements DiscountStrategy {
    @Override
    public double applyDiscount(double price) {
        return price * 0.8;
    }
}

// 上下文类:购物车
class ShoppingCart {
    private DiscountStrategy discountStrategy;

    public ShoppingCart(DiscountStrategy discountStrategy) {
        this.discountStrategy = discountStrategy;
    }

    public void setDiscountStrategy(DiscountStrategy discountStrategy) {
        this.discountStrategy = discountStrategy;
    }

    public double calculateTotal(double price) {
        return discountStrategy.applyDiscount(price);
    }
}

// 客户端代码
public class StrategyPatternExample {
    public static void main(String[] args) {
        // 创建不同的折扣策略
        DiscountStrategy noDiscount = new NoDiscountStrategy();
        DiscountStrategy tenPercentDiscount = new TenPercentDiscountStrategy();
        DiscountStrategy twentyPercentDiscount = new TwentyPercentDiscountStrategy();

        // 创建购物车并使用无折扣策略
        ShoppingCart cart = new ShoppingCart(noDiscount);
        double price = 100;
        System.out.println("无折扣时总价: " + cart.calculateTotal(price));

        // 切换到 10% 折扣策略
        cart.setDiscountStrategy(tenPercentDiscount);
        System.out.println("10% 折扣时总价: " + cart.calculateTotal(price));

        // 切换到 20% 折扣策略
        cart.setDiscountStrategy(twentyPercentDiscount);
        System.out.println("20% 折扣时总价: " + cart.calculateTotal(price));
    }
}

代码解释

  1. 策略接口 DiscountStrategy:定义了 applyDiscount() 方法,用于计算折扣后的价格。
  2. 具体策略类(NoDiscountStrategyTenPercentDiscountStrategyTwentyPercentDiscountStrategy:实现了 DiscountStrategy 接口,分别提供了无折扣、10% 折扣和 20% 折扣的具体算法。
  3. 上下文类 ShoppingCart:维护了一个 DiscountStrategy 类型的引用,通过构造函数或 setDiscountStrategy() 方法来设置具体的折扣策略。calculateTotal() 方法将计算总价的任务委托给具体的折扣策略类。
  4. 客户端代码:创建了不同的折扣策略对象和购物车对象,通过调用购物车的 calculateTotal() 方法计算不同折扣策略下的总价,并可以动态切换折扣策略。

优点

  1. 可扩展性:策略模式符合开闭原则,当需要添加新的算法时,只需要创建一个新的具体策略类,而不需要修改现有的代码。
  2. 代码复用:每个具体策略类封装了一个独立的算法,这些算法可以在不同的上下文中复用。
  3. 消除条件判断:避免了使用大量的 if - elseswitch - case 语句来选择不同的算法,使代码更加简洁和可读。

缺点

  1. 类的数量增加:随着策略的增加,具体策略类的数量也会增加,导致系统中的类数量增多,增加了系统的复杂度。
  2. 客户端需要了解策略:客户端需要了解不同的策略及其适用场景,才能正确选择合适的策略,这增加了客户端的使用难度。

应用场景

  1. 算法选择:当一个系统需要根据不同的情况选择不同的算法时,如排序算法、加密算法等,可以使用策略模式。
  2. 支付方式选择:在电商系统中,用户可以选择不同的支付方式(如支付宝、微信支付、银行卡支付等),每种支付方式可以看作是一个具体的策略。
  3. 游戏中的角色行为:在游戏开发中,角色可能有不同的行为模式(如攻击模式、防御模式、逃跑模式等),可以使用策略模式来实现角色在不同模式下的行为。
Java设计模式 文章被收录于专栏

设计模式是软件开发中针对反复出现的问题所总结归纳出的通用解决方案,它可以帮助开发者更高效地构建软件系统,提升代码的可维护性、可扩展性和可复用性。

全部评论
点赞 回复 分享
发布于 04-07 11:51 广东

相关推荐

首先我要吐槽一下这里的电动车,我去,他们都不看红灯的吗?他们都这么勇敢的吗?全是改装车,开的老快了我靠,交警呢?管一下啊,还有地铁门口一堆拉客的改装电动车是怎么回事?然后为什么没有!非!机!动!车!道!然后就自己的一些建议与体会吧,自己的一些基本信息可以在上一篇帖子里看到,楼主是双非硕士,第一次来南方。-----关于生活-----楼主是周六来的深圳周一就要上班,于是顶着感冒完成了在网上找房➡联系中介看房➡买生活用品➡在上班地点附近打卡等等,忙完这些真的好累。楼主租的房子是1900的租金,算上物业和网费,一个月2130这样,面积30平左右,离着上班的地方步行5分钟就到了,然后给大家的找房建议就是多去豆瓣和咸鱼看看,看房软件的话自如和链家靠谱点,楼主住的是单间,没有合租,嗯。。下次找房应该会考虑合租,因为一个人住太孤单了, 在北京的时候起码还能和合租室友散散步~~-----关于工作-----楼主负责的是机器人的视觉算法,每天上班时间是985,因为是刚来,所以分配的活并不是很多,所以还算是清闲,但我看那些正式员工基本都熬到9点才下班,有的部门经常要加班到9.30左右,甚至测试那边清明节都在加班,非常恐怖,仿佛加班已经成了义务一样,不过我们算法部门其实还好,加班并不是很严重,严重的是产研交付的那些人(有些人甚至加班到了凌晨),但其实现在小帅也在骑驴找马,因为这个公司实在是感觉一言难尽,可最近投的简历基本都是没有回应的,所以有一种说不出来的苦涩,唉。-----关于自己-----下飞机的第一感觉就被南方这边的生态吸引到了,十分的新奇,到处都是绿植,小区里,居民楼上,甚至屋顶都是鲜花,高架桥上也是布满了鲜花,还有公司墙壁上的那些绿藤,感觉好看极了,自己十分的喜欢,没有北京的那种压抑,但其实自己还是挺习惯北京的生活的,不知道为什么。然后其他的就没觉得有什么特别的地方了吧,毕竟每天都是两点一线的生活,其实也体会不到什么,不过楼主的同事人都挺好的,也算是一种慰藉了吧~~-----一些建议-----这是楼主来了之后的感想,如果可以的话,还是建议大家找个离家近的工作,因为你生活的城市里没有朋友的话是真的很孤单,想要融入别人的圈子又很难,所以大可不必为了几点碎银跑来这里,在家那边找个轻松点的工作然后再找一个女朋友要比在这里舒服很多,来到这里之后,自己思考了很多事情,为什么要跑这么远,意义又是什么,这份工作也不是很高薪,虽然在我所有的工作里算是最高的了,但我以后会定居在这里吗?如果不是,那还不是要回老家,总之,一个人的时候就很容易陷入这种思考的漩涡,会很痛苦。。。最后,楼主十分感谢自己的姑姑,姑姑年纪不小了,刚来那一天一直陪着自己到处跑去看房,还不断地告诉我这边的一些生活习惯,工作上要注意的地方以及对楼主在人生上面的一些开导,直到陪我到了晚上9点吃完饭她才回去,楼主真的感动不已,发誓等发了工资一定要去请姑姑她们吃最好的饭!PS. 姑姑清明带自己去大梅沙玩的图#牛友故事会#
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务