Java设计模式--策略模式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java设计模式--策略模式相关的知识,希望对你有一定的参考价值。
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设计模式--策略模式的主要内容,如果未能解决你的问题,请参考以下文章