策略模式是一种行为型模式,它将对象和行为分开,将行为定义为一组行为接口和具体的实现。策略模式最大的特点是行为的变化,行为之间可以相互替换。
设计策略模式时,需要分析项目中变化和不变的部分,将变化部分抽离出来, 定义为接口和实现。以分析鸭子为例,鸭子会叫,飞和游泳。不同鸭子叫的,飞的不一样。后面给出不使用策略模式和使用策略模式情况下类结构和具体代码实现
在不使用策略模式的情况下,类的结构是这样的:
代码实例
步骤 1:创建抽象类
public abstract class Duck {
public void fly() {
System.out.println("duck fly");
}
public void quack() {
System.out.println("duck quack");
}
public void swim() {
System.out.println("i am swimming");
}
public abstract void display();
}
步骤二:创建子类
GreenDuck.java:
public class GreenDuckextends Duck {
@Override
public void display() {
System.out.println("this is a green duck");
}
@Override
public void fly() {
System.out.println("fly good");
}
@Override
public void quack() {
System.out.println("quack good");
}
}
RedDuck.java:
public class RedDuckextends Duck {
@Override
public void display() {
System.out.println("this is red duck");
}
@Override
public void fly() {
System.out.println("bad fly");
}
@Override
public void quack() {
System.out.println("no quack ");
}
}
该结构的一个缺陷是,如果想更改RedDuck和GreenDuck中飞和叫的行为时,需要更改两个类中的fly()和quack()方法,当需要更改很多行为,且行为中代码有很多重复时,会造成不必要的代码冗余和时间浪费,也容易出错。这时,策略模式就是比较好的一个选择。
使用策略模式后的类图结构
代码实例:
步骤 1 创建行为接口和行为实现类
public interface FlyBehavior {
void fly();
}
public class GoodFlyBeihaviorimplements FlyBehavior {
@Override
public void fly() {
System.out.println("good fly");
}
}
public class BadFlyBehaviorimplements FlyBehavior {
@Override
public void fly() {
System.out.println("bad fly");
}
}
步骤二:定义抽象实体类
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck(FlyBehavior flyBehavior,QuackBehavior quackBehavior){
this.flyBehavior=flyBehavior;
this.quackBehavior=quackBehavior;
}
public void fly(){
flyBehavior.fly();
}
public void quack(){
quackBehavior.quack();
}
public void swim(){
System.out.println("i am swimming");
}
public abstract void display();
}
步骤三:定义具体实体类,继承抽象实体类
public class GreenDuck extends Duck {
public GreenDuck(){
super(new GoodFlyBeihavior(),new GoodQuackBehavior());
}
@Override
public void display() {
System.out.println("this is a green duck");
}
}
如果想替换子类中的行为,仅需像父类传递对应行为的实现类即可。
代码实例参见:https://github.com/jxl198/designPattern/tree/master/strategy
注意点:
在进行设计项目结构中,尽量少用集成,多用组合
策略模式一个明显的缺点是当备用行为过多时,行为对象会非常庞大
网友评论