设计模式-策略模式
基本介绍
- 策略模式(Strategy Pattern)中,定义算法簇,分别封装起来,让他们之间可以相互替换,此模式让算法的独立变化独立于使用算法的客户
- 这算法体现了几个设计原则,1.把变化的代码从不变的代码里分离出来;2.针对接口编程而不是具体类(定义了策略接口);3.多用组合/聚合,少用继承
策略模式的注意事项和细节
- 策略模式的关键是:分析项目中变化部分与不变部分
- 策略模式的核心思想是:多用组合,聚合,少用继承;用行为类组合,而不是行为的继承,更有弹性
- 体现了“对修改关闭,对扩展开放”原则,客户端增加行为不用修改源代码,只要添加一种策略即可,避免了使用多重转移语句(if…else)
- 提供了可替换继承关系的办法:策略模式将算法封装在独立的Strategy类中使得你可以独立其Context改变他,使他易于切换,易于理解,易于扩展
- 需要注意的是:每添加一个策略就要增加一个类,当策略过多会导致类数目庞大
代码实现
使用策略模式实现不同鸭子的行为
public abstract class Duck {
FlyBehavior flyBehavior;
public Duck() {
}
//显示鸭子信息
public abstract void display();
public void quack() {
System.out.println("鸭子嘎嘎叫");
}
public void swim() {
System.out.println("鸭子游泳");
}
public void fly() {
if (flyBehavior != null) {
flyBehavior.fly();
}
}
}
public class ToyDuck extends Duck {
public ToyDuck() {
flyBehavior = new NoFlyBehavior();
}
@Override
public void display() {
System.out.println("玩具鸭子");
}
}
public class WildDuck extends Duck {
//构造器传入
public WildDuck() {
flyBehavior = new GoodFlyBehavior();
}
@Override
public void display() {
}
}
public class PekingDuck extends Duck {
public PekingDuck() {
flyBehavior = new BadFlyBehavior();
}
@Override
public void display() {
System.out.println("北京鸭子");
}
}
//策略接口
public interface FlyBehavior {
void fly();
}
public class GoodFlyBehavior implements FlyBehavior {
@Override
public void fly() {
System.out.println("飞翔技术很好");
}
}
public class NoFlyBehavior implements FlyBehavior {
@Override
public void fly() {
System.out.println("不会飞翔");
}
}
public class BadFlyBehavior implements FlyBehavior {
@Override
public void fly() {
System.out.println("飞翔技术一般");
}
}
//客户端
public class Client {
public static void main(String[] args) {
WildDuck wildDuck = new WildDuck();
wildDuck.fly();
ToyDuck toyDuck = new ToyDuck();
toyDuck.fly();
}
}