Java设计模式--策略模式

1.策略模式

1.1定义

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

1.2 底层机制

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

1.3体现的设计原则

一、把会变化的部分取出并“封装”起来,好让其余部分不会受到影响。设计模式

二、针对接口编程,而不是针对实现编程。工具

三、多用组合,少用继承。测试

1.4优缺点

优势:spa

一、能够避免代码重复。设计

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

三、算法能够自由切换。blog

缺点:继承

一、策略模式只适用于客户端知道全部的算法或行为的状况。

二、策略模式形成不少策略类,每一个具体策略类都会产生一个新类。

1.5案例:模拟鸭子游戏

1.5.1类图

1.5.2 代码逻辑

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

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

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

四、编写测试类。

1.5.3代码实现

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

     public interface FlyBehavior {

public void fly();

   }

 

  public interface QuackBehavior {

   public void quack();

   }

二、实现鸭子类,定义成抽象类。(经过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!");

}

}

三、编写具体的行为。

       全部飞行行为类

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 >>");

}

}

四、创建一个新的鸭子类:

public class ModelDuck extends Duck {

public ModelDuck() {

flyBehavior = new FlyNoWay();

quackBehavior = new Quack();

}

public void display() {

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

}

}

 

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

public class FlyRocketPowered implements FlyBehavior {

public void fly() {

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

}

}

六、编写测试类

public class MiniDuckSimulator1 {

 

public static void main(String[] args) {

 

Duck model = new ModelDuck();

model.performQuack();

model.performFly();

model.setFlyBehavior(new FlyRocketPowered());

model.performFly();

}

   }

 

七、

 
   

运行结果

1.6思惟拓展

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

二、MQ

三、WEBSERIVE

1.7应用场景

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

二、须要在不一样状况下使用不用的策略(算法),或者策略还可能在将来用其余方式来实现。

三、对客户隐藏具体策略算法的细节,实现彼此彻底独立。

1.8应用实例

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

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

1.9注意事项

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

相关文章
相关标签/搜索