< 返回技术文档列表

java设计模式中策略模式的示例分析

发布时间:2021-09-01 02:53:07⊙投诉举报

小编给大家分享一下java设计模式中策略模式的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

    策略模式

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

    • 主要解决:在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。

    • 如何解决:将这些算法封装成一个一个的类,任意地替换。

    • 何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。

    使用场景:

    • 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。

    • 一个系统需要动态地在几种算法中选择一种。

    • 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

    优点缺点
    算法可以自由切换策略类会增多
    避免使用多重条件判断所有策略类都需要对外暴露
    扩展性良好

    java设计模式中策略模式的示例分析

    • 环境类(Context):持有抽象策略类的引用,用来操作策略的上下文环境。

    • 抽象策略类(Strategy):策略的抽象类或接口,给出所需实现接口。

    • 具体策略类(ConcreteStrategy):具体的策略实现。

    Demo

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

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

    首先看第一种方法:

    java设计模式中策略模式的示例分析

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

    java设计模式中策略模式的示例分析

    代码:

    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("飞行能力一般");
        }
    }
    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("游得一般");
        }
    }
    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();
        }
    }
    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();
        }
    }

    运行结果:

    java设计模式中策略模式的示例分析

    看完了这篇文章,相信你对“java设计模式中策略模式的示例分析”有了一定的了解,如果想了解更多相关知识,欢迎关注血鸟云行业资讯频道,感谢各位的阅读!


    /template/Home/Zkeys/PC/Static