前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式-策略模式(鵝鵞䳘䳗)

设计模式-策略模式(鵝鵞䳘䳗)

作者头像
唔仄lo咚锵
发布2021-09-14 11:23:19
2950
发布2021-09-14 11:23:19
举报

文章目录

在这里插入图片描述
在这里插入图片描述

策略模式


策略模式(Strategy Pattern)属于行为型模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。用算法族分别封装起来,实现同一个接口,让他们之间可以互相替换,让算法的变化独立于使用算法的客户。

  • 主要解决:在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。
  • 如何解决:将这些算法封装成一个一个的类,任意地替换。
  • 何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。
  • 使用场景:
  1. 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
  2. 一个系统需要动态地在几种算法中选择一种。
  3. 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

优点

缺点

算法可以自由切换

策略类会增多

避免使用多重条件判断

所有策略类都需要对外暴露

扩展性良好

在这里插入图片描述
在这里插入图片描述
  • 环境类(Context):持有抽象策略类的引用,用来操作策略的上下文环境。
  • 抽象策略类(Strategy):策略的抽象类或接口,给出所需实现接口。
  • 具体策略类(ConcreteStrategy):具体的策略实现。

Demo


有几种鹅:天鹅、野鹅、灰鹅,鹅有各种行为,如飞、游泳、叫等。 假设天鹅灰鹅飞行能力一般,野鹅飞行能力优秀;天鹅野鹅游泳能力一般,灰鹅游泳能力优秀。

首先看第一种方法:

在这里插入图片描述
在这里插入图片描述

这种方法固然可以实现目的,但问题显而易见,子类过多覆盖父类方法,代码未复用,耦合度很高。 使用策略模式,简单来说,就是封装子类行为成接口,父类包含该接口即可。

在这里插入图片描述
在这里插入图片描述

插播反爬信息 )博主CSDN地址:https://wzlodq.blog.csdn.net/

代码:

代码语言:javascript
复制
public interface FlyBehavior {
    void fly();
}

public class FlyGood implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("飞行能力优秀");
    }
}

public class FlyNormal implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("飞行能力一般");
    }
}
代码语言:javascript
复制
public interface SwimBehavior {
    void swim();
}

public class SwimGood implements SwimBehavior {
    @Override
    public void swim() {
        System.out.println("游得好");
    }
}

public class SwimNormal implements SwimBehavior {
    @Override
    public void swim() {
        System.out.println("游得一般");
    }
}
代码语言:javascript
复制
public abstract class Goose {
    //策略接口
    FlyBehavior flyBehavior;
    SwimBehavior swimBehavior;

    //其他属性等...

    public void setFlyBehavior(FlyBehavior flyBehavior) {
        this.flyBehavior = flyBehavior;
    }

    public void setSwimBehavior(SwimBehavior swimBehavior) {
        this.swimBehavior = swimBehavior;
    }
}

public class Swan extends Goose{
    public Swan() {
        flyBehavior=new FlyNormal();
        swimBehavior=new SwimNormal();
    }
}

public class WildGoose extends Goose{
    public WildGoose() {
        flyBehavior=new FlyGood();
        swimBehavior=new SwimNormal();
    }
}

public class GreyGoose extends Goose{
    public GreyGoose() {
        flyBehavior=new FlyNormal();
        swimBehavior=new SwimGood();
    }
}
代码语言:javascript
复制
public class Client {
    public static void main(String[] args) {
        Swan swan=new Swan();
        swan.flyBehavior.fly();

        WildGoose wildGoose=new WildGoose();
        wildGoose.swimBehavior.swim();

        GreyGoose greyGoose=new GreyGoose();
        greyGoose.flyBehavior.fly();
        greyGoose.setFlyBehavior(new FlyGood()); //改变某个对象的行为
        greyGoose.flyBehavior.fly();
    }
}

运行结果:

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-12-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 策略模式
  • Demo
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档