前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【云+社区年度征文】设计模式-策略模式

【云+社区年度征文】设计模式-策略模式

原创
作者头像
唔仄lo咚锵
修改2020-12-17 09:51:58
4110
修改2020-12-17 09:51:58
举报
文章被收录于专栏:blog(为什么会重名,真的醉了)

策略模式

***

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

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

优点

缺点

算法可以自由切换

策略类会增多

避免使用多重条件判断

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

扩展性良好

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

Demo

***

有几种鹅:天鹅、野鹅、灰鹅,鹅有各种行为,如飞、游泳、叫等。

假设天鹅灰鹅飞行能力一般,野鹅飞行能力优秀;天鹅野鹅游泳能力一般,灰鹅游泳能力优秀。

首先看第一种方法:

这种方法固然可以实现目的,但问题显而易见,子类过多覆盖父类方法,代码未复用,耦合度很高。

使用策略模式,简单来说,就是封装子类行为成接口,父类包含该接口即可。

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

代码语言:txt
复制
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("飞行能力一般");
    }
}
代码语言:txt
复制
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("游得一般");
    }
}
代码语言:txt
复制
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();
    }
}
代码语言:txt
复制
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();
    }
}

运行结果:

原创不易,请勿转载本不富裕的访问量雪上加霜

博主首页:https://wzlodq.blog.csdn.net/

微信公众号:唔仄lo咚锵

如果文章对你有帮助,记得一键三连❤

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

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