当前位置: 主页 > JAVA语言

java 策略模式 例子-鸭子用不同策略即可策略模式鸭子问题解决

发布时间:2023-06-16 07:02   浏览次数:次   作者:佚名

概念:

设计模式是人们在对面同类型软件工程 设计问题所总结出的一些有用经验。模式不是代码,而是某类问题的通用设计解决方案。

策略,指计策;谋略。一般是指:1. 可以实现目标的方案集合;2. 根据形势发展而制定的行动方针和斗争方法

策略模式:分别封装行为接口,实现算法族,超类里放行为接口对象,在子类里具体设定行为对象。原则:分离变化部分,封装接口,基于接口编程各种功能。

问题引入

Head First里面的例子java 策略模式 例子,一段程序要实现不同的鸭子叫和鸭子飞.

Duck类:

package com.duck.mark;
public abstract class Duck {
    int aga;
    abstract public void fly();
    abstract public void quack();
}

绿鸭子

java原型模式例子_策略模式 例子_java 策略模式 例子

package com.duck.mark;
public class BlueDuck extends Duck{
    @Override
    public void fly() {
        System.out.println("blue duck fly");
    }
    @Override
    public void quack() {
        System.out.println("blue duck quack");
    }
}

红鸭子:

package com.duck.mark;
public class RedDuck extends Duck{
    @Override
    public void fly() {
        System.out.println("red duck fly");
    }
    @Override
    public void quack() {
        System.out.println("red duck quack");
    }
}

木头鸭子

package com.duck.mark;
public class WoodDuck {
    //不会叫
    //不会飞
}

当遇到引入的木头鸭子,不是动物时。这个鸭子不会叫,也不会飞,但是木头鸭子也属于鸭子的一种,所以应该继承Duck类,但是他确实现不了叫,飞的功能

所以我们把这些有变化的行为或者说方法封装成一组策略,不同的鸭子用不同策略即可

java 策略模式 例子_java原型模式例子_策略模式 例子

策略模式鸭子问题解决UML类图

在这里插入图片描述

代码

我们写一个工人去上班的程序去实现策略模式

去上班有很多交通工具可选

在这里插入图片描述

有关idea显示类图不显示属性和方法的问题,参考

策略模式 例子_java 策略模式 例子_java原型模式例子

一般的,策略模式主要分为以下三个角色:

1. 环境角色(Context):持有一个策略类引用 (本例中的 Worker类里面有一个goBehavior引用)

2. 抽象策略(Strategy):定义了多个具体策略的公共接口,具体策略类中各种不同的算法以不同的方式实现这个接口;Context使用这些接口调用不同实现的算法。一般的,我们使用接口或抽象类实现。 (GoBehavior 接口)

3. 具体策略(ConcreteStrategy):实现抽象策略类中的相关的算法或操作。(GoBehaviorByFoot ,GoBehaviorByCar ,GoBehaviorByBus )

package com.worker.mark;
public class Worker {
    int age;
    GoBehavior goBehavior;
    //为了灵活选择策略
    public void setGoBehavior(GoBehavior goBehavior) {
        this.goBehavior = goBehavior;
    }
   public void go(){
       goBehavior.go();
   }
    public static void main(String[] args) {
        Worker worker1=new HaveCarWorker();
        worker1.go();
        Worker worker2=new NoCarWorker();
        worker2.go();
        Worker worker3=new NoCarWorker();
        worker3.setGoBehavior(new GoBehaviorByFoot());
        worker3.go();
    }
}

package com.worker.mark;
public class HaveCarWorker extends Worker{
    public HaveCarWorker(){
        goBehavior=new GoBehaviorByCar();
    }
}

package com.worker.mark;
public class NoCarWorker extends Worker{
    public NoCarWorker(){
        goBehavior=new GoBehaviorByBus();
    }
}

策略模式 例子_java 策略模式 例子_java原型模式例子

package com.worker.mark;
public interface GoBehavior {
   public void go();
}

package com.worker.mark;
public class GoBehaviorByFoot implements GoBehavior{
    @Override
    public void go() {
        System.out.println("go by foot");
    }
}

package com.worker.mark;
public class GoBehaviorByBus implements GoBehavior {
    @Override
    public void go() {
        System.out.println("go by bus");
    }
}

package com.worker.mark;
public class GoBehaviorByCar implements GoBehavior {
    @Override
    public void go() {
        System.out.println("go by car");
    }
}

运行结果:

在这里插入图片描述

适用场景 代码级别

策略模式 例子_java 策略模式 例子_java原型模式例子

当不同的行为堆砌在一个类中时,就很难避免使用条件语句来选择合适的行为。将这些行为封装在一个个独立的策略类中,可以在使用这些行为的类中消除条件语句

业务级别

策略模式就是用来封装策略的,但在实践中,我们发现可以用它来封装几乎任何类型的规则java 策略模式 例子,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性

总结:

策略模式是一种定义一系列策略的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合

不明白耦合的概念 参见此文章

策略模式的策略类层次为GoBehavior定义了一系列的可供重用的算法或行为。继承有助于吸取出这些算法中公用功能

在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的策略对象

注:如果文章有任何错误或不足,请各位大佬尽情指出,评论留言留下您宝贵的建议!如果这篇文章对你有些许帮助,希望可爱亲切的您点个赞推荐一手,非常感谢啦

在这里插入图片描述