java设计模式--策略模式

     2022-03-15     183

关键词:

1.策略模式

1.1定义

策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

1.2 底层机制

将有共性的行为抽象为一个接口,其中有此种行为的声明。该接口的实现类都实现了这个行为,但是提供了不同的行为表现。在执行此类行为的类中含有该接口的引用,在执行行为前要确定该行为的表现,选择适合的执行。

1.3体现的设计原则

1、把会变化的部分取出并“封装”起来,好让其他部分不会受到影响。

2、针对接口编程,而不是针对实现编程。

3、多用组合,少用继承。

1.4优缺点

优点:

1、可以避免代码重复。

2、扩展性良好。在添加新的行为时,不用修改写好的代码。

3、算法可以自由切换。

缺点:

1、策略模式只适用于客户端知道所有的算法或行为的情况。

2、策略模式造成很多策略类,每个具体策略类都会产生一个新类。

1.5案例:模拟鸭子游戏

1.5.1类图

技术分享

1.5.2 代码逻辑

1、取出易于变化的部分,将其封装成类,建立一组新的类来表示每个行为。首先,在Duck类中“加入两个实例变量”,分别为“FlyBehavior”与“QuackBehavior”,声明成接口类型(不是具体的实现类型)。

2、Duck类中实现“performFly()”与“performQuack()”,在这个方法中鸭子不会亲自处理飞和呱呱叫的行为,而是委托给行为类处理。

3、实现具体类型的鸭子类。

4、编写测试类。

1.5.3代码实现

1、实现“飞”和“叫”行为的封装,定义成接口类型。

     public interface FlyBehavior {

public void fly();

   }

 

  public interface QuackBehavior {

   public void quack();

   }

2、实现鸭子类,定义成抽象类。(通过set方法动态设置鸭子的行为)

public abstract class Duck {

FlyBehavior flyBehavior;

QuackBehavior quackBehavior;

 

abstract void display();

 

public Duck() {

}

public void setFlyBehavior(FlyBehavior fb) {

flyBehavior = fb;

}

public void setQuackBehavior(QuackBehavior qb) {

quackBehavior = qb;

}

public void performFly() {

flyBehavior.fly();

}

public void performQuack() {

quackBehavior.quack();

}

public void swim() {

System.out.println("All ducks float, even decoys!");

}

}

3、编写具体的行为。

       所有飞行行为类

public class FlyWithWings implements FlyBehavior {

public void fly() {

System.out.println("I‘m flying!!");

}

}

 

public class FlyNoWay implements FlyBehavior {

public void fly() {

System.out.println("I can‘t fly");

}

}

   所有叫的行为类

public class Quack implements QuackBehavior {

public void quack() {

System.out.println("Quack");

}

}

 

public class Squeak implements QuackBehavior {

public void quack() {

System.out.println("Squeak");

}

}

 

public class MuteQuack implements QuackBehavior {

public void quack() {

System.out.println("<< Silence >>");

}

}

4、建立一个新的鸭子类:

public class ModelDuck extends Duck {

public ModelDuck() {

flyBehavior = new FlyNoWay();

quackBehavior = new Quack();

}

public void display() {

System.out.println("I‘m a model duck");

}

}

 

5、添加一个新的飞行类型。

public class FlyRocketPowered implements FlyBehavior {

public void fly() {

System.out.println("I‘m flying with a rocket");

}

}

6、编写测试类

public class MiniDuckSimulator1 {

 

public static void main(String[] args) {

 

Duck model = new ModelDuck();

model.performQuack();

model.performFly();

model.setFlyBehavior(new FlyRocketPowered());

model.performFly();

}

   }

 

7、

 
   

运行结果

1.6思维拓展

1、设计模式的基础包括:抽象、封装、多态、继承。

2、MQ

3、WEBSERIVE

1.7应用场景

1、在一个系统种多个类之间的区别仅在于他们的行为不同。

2、需要在不同情况下使用不用的策略(算法),或者策略还可能在未来用其他方式来实现。

3、对客户隐藏具体策略算法的细节,实现彼此完全独立。

1.8应用实例

1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。

2、旅行的出游方式,选择不同的出行工具,每一种旅行方式都是一个策略

1.9注意事项

1、如果一个系统的策略多于四个,就考虑使用混合模式,解决策略类膨胀的问题。

 

java设计模式之策略模式

    策略模式属于对象的行为模式,策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换,策略模式让算法独立于使用它的客户而独立变化。策略模式使这些算法在客户端调用它们... 查看详情

java设计模式之策略模式

...此模式让算法的变化,不会影响到使用算法的客户(大话设计模式)。策略模式UML图      策略模式代码   古代的各种计谋都是一种策略,这次我们的例子就拿其中一种离间计来写的,理解起来非常容易,代码... 查看详情

java-设计模式-策略模式

策略模式其实就是对各种行为算法的包装,各种不同的行为的算法的分离。属于对象的行为模式。650)this.width=650;"src="http://www.jasongj.com/img/designpattern/strategy/Strategy.png"alt="StrategyPatternClassDiagram"/>策略模式类图,比较简单,没有自己... 查看详情

java设计模式之策略模式

1.策略模式的介绍  策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。简单的... 查看详情

java设计模式7.策略模式模板方法模式观察者模式

策略模式策略模式的用意,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。环境角色:持有一个抽象策略角色的引用。抽象策略角色:... 查看详情

java策略模式

策略模式策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。这个模式涉及到三个... 查看详情

java设计模式—策略模式

定义    通过选择策略类,来执行不同算法分支。核心是通过注入对象,改变行为。此模式其实就是springIOC思想。优点   1.算法可以自由的切换。   2.避免使用多重条件判断。   3.便于扩展:增加一个策略只需... 查看详情

java设计模式—策略模式

定义    通过选择策略类,来执行不同算法分支。核心是通过注入对象,改变行为。此模式其实就是springIOC思想。优点   1.算法可以自由的切换。   2.避免使用多重条件判断。   3.便于扩展:增加一个策略只需... 查看详情

java之策略模式(大话设计模式)

温故而知新,每次读设计模式都会有不同的体验,坚持每天一个设计模式,直到熟练运用设计模式。策略模式定义了很多完成相同工作的算法,但实现不同,它可以以相同的方式调用所有的算法,减少了算法和调用算法的耦合。... 查看详情

java描述设计模式(22):策略模式

本文源码:GitHub·点这里||GitEE·点这里一、生活场景每年双十一,各大电商平台会推出不同的满减策略,当用户的消费金额满一定额度后,会进行减去一定的优惠额度,从而来一波清仓甩卖,使用策略模式来描述该流程。publicclassC01_I... 查看详情

java设计模式-策略模式

  第一次好好的看设计模式,可能有不对的地方,大佬们可以下面指出,感谢!  -----------分割线----------  场景:商城打折活动,但是我不确定是打几折,因为换季可能打折力度不一样,8折,9折,满300减50等等等等,这... 查看详情

策略模式

...至于用何种方法取决于我们的选择。我们同样借助《大话设计模式》中实现策略模式的例子来做讲解。超市进 查看详情

java设计模式1-策略模式

策略模式:分别封装行为接口,实现算法族,超类里放行为的接口对象,在子类里具体设定行为对象.原则就是:分离变化部分,封装接口,基于接口编程各种功能.为什么要用策略模式{继承带来的问题:(为策略模式)对类的局部改动,尤其是... 查看详情

java策略模式,comparator

package 设计模式.策略模式;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.Iterator;import java.util.List;/** * @dep 查看详情

java设计模式--策略模式

1.策略模式1.1定义策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。1.2底层机制将有共性的行为抽象为一个接口,其中有此种行为的声明。该接口的实现类都实现... 查看详情

java设计模式—策略模式

定义    通过选择策略类,来执行不同算法分支。核心是通过注入对象,改变行为。此模式其实就是springIOC思想。优点   1.算法可以自由的切换。   2.避免使用多重条件判断。   3.便于扩展:增加一个策略只需... 查看详情

java设计模式之——策略模式

1、策略模式有什么好处?    策略模式的好处在于你可以动态的改变对象的行为。2、设计原则    设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口(c++中可以用虚类... 查看详情

java策略模式(代码片段)

查看详情