设计模式-22策略模式

策略模式定义了一组算法族,将它们封装起来,使它们可以相互替换。这种模式让算法的变化独立于使用它的客户。文章通过鸭子飞翔能力的例子展示了如何实现策略模式,包括不同类型的飞行动作如不会飞、好飞、差飞。同时提到了JDK中Arrays的Comparator接口作为策略模式的应用,以及模式的核心思想是使用组合而非继承来增加灵活性,遵循开闭原则。
摘要由CSDN通过智能技术生成

策略模式

基本介绍:
  • 策略模式中,定义算法族,分别封装起来,让他们之间可以相互替换,此模式算法的变化独立于使用算法的用户
  • 策略模式体现了几个设计原则:第一、把变化的代码从不变得代码中分离出来;第二、针对接口编程而不是具体类(定义了策略接口);第三、多用组合或聚合少用继承(客户使用组合方式使用策略)
原理类图:

在这里插入图片描述

案例:

​ 策略模式实现各种鸭子的飞翔能力
在这里插入图片描述

public interface Fly {
    void fly();
}

public class NoFly implements Fly {
    @Override
    public void fly() {
        System.out.println("不会飞翔");
    }
}

public class GoodFly implements Fly {
    @Override
    public void fly() {
        System.out.println("good fly技术");
    }
}

public class BadFly implements Fly {
    @Override
    public void fly() {
        System.out.println("飞翔能力不好。。");
    }
}


public abstract class Duck {
    protected Fly fly;

    public Duck() {
    }

    protected abstract void display();

    protected void fly(){
        if(fly != null){
            fly.fly();
        }
    }
}

public class PekingDuck extends Duck {
    public PekingDuck() {
        fly = new BadFly();
    }

    @Override
    protected void display() {
        System.out.println("北京鸭");
    }
}

public class WildDuck extends Duck {

    public WildDuck() {
        fly = new GoodFly();
    }

    @Override
    protected void display() {
        System.out.println("野鸭");
    }
}

public class ToyDuck extends Duck {
    public ToyDuck() {
        fly = new NoFly();
    }

    @Override
    protected void display() {
        System.out.println("玩具鸭");
    }
}

public class Client {

    public static void main(String[] args) {
        final WildDuck wildDuck = new WildDuck();
        wildDuck.display();
        wildDuck.fly();

        final PekingDuck pekingDuck = new PekingDuck();
        pekingDuck.display();
        pekingDuck.fly();


        final ToyDuck toyDuck = new ToyDuck();
        toyDuck.display();
        toyDuck.fly();
    }
}
策略模式在JDK-Arrays中的使用:
  • Arrays中的comparator就使用到了策略接口,通过对接口的不同的实现完成对array的降序或升序排序
策略模式注意事项和细节:
  • 策略模式的关键是:分析项目中变化部分和不变部分
  • 策略模式的核心思想是:多用组合、聚合,少用继承;用行为类组合,而不是行为继承,更具弹性
  • 体现了“对修改关闭,对扩展开发”原则,客户端增加行为不用修改源代码,只要添加一种策略或者行为即可,避免使用多重转移语句(if…else if…else)
  • 提供了可以替换继承关系的方法:策略模式将算法封装在独立的strategy类中,使得你可以独立于其Context改变他,使它易于切换、易于理解、易于扩展
  • 需要注意的是:没添加一个策略就要增加一个类,当策略过多时会导致类数目庞大
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值