定义:
- 定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户
- 这算法体现了几个设计原则
第一、把变化的代码从不变的代码中分离出来;
第二、针对接口编程而不是具体类(定义了策略接口);
第三、多用组合/聚合,少用继承(客户通过组合方式使用策略)。
- 多用组合/聚合 少用继承;用行为类组合,而不是行为的继承。更有弹性
- 体现了“对修改关闭,对扩展开放”原则,客户端增加行为不用修改原有代码,只要添加一种策略(或者行为)即可,避免了使用多重转移语句(if…else if…else)
- 需要注意的是:每添加一个策略就要增加一个类,当策略过多是会导致类数目庞大
三个角色:
- 抽象策略(Strategy):通常由接口或抽象类实现。定义了多个具体策略的公共接口,具体策略类中各种不同的算法以不同的方式实现这个接口;Context使用这些接口调用不同实现的算法。
- 具体策略(ConcreteStrategy):实现Strategy接口或继承于抽象类Strategy,封装了具体的算法和行为。
- 环境类(Contex):持有一个公共策略接口的引用,直接给客户端调用。
代码
public class test19 {
public static void main(String[] args) {
//野鸭
System.out.println("野鸭的实际飞翔能力");
WildDuck wildDuck = new WildDuck();
wildDuck.fly();
//玩具鸭
System.out.println("玩具鸭的实际飞翔能力");
ToyDuck toyDuck = new ToyDuck();
toyDuck.fly();
System.out.println("北京鸭的实际飞翔能力");
//北京鸭
PekingDuck pekingDuck = new PekingDuck();
pekingDuck.fly();
/* 野鸭的实际飞翔能力
飞翔技术高超~~~~
玩具鸭的实际飞翔能力
不会飞翔~~~~
北京鸭的实际飞翔能力
飞翔技术一般~~~~*/
}
}
interface FlyBehavior{
void fly();//子类具体实现
}
class GoodFlyBehavior implements FlyBehavior{
@Override
public void fly() {
System.out.println("飞翔技术高超~~~~");
}
}
class BadFlyBehavior implements FlyBehavior{
@Override
public void fly() {
System.out.println("飞翔技术一般~~~~");
}
}
class NoFlyBehavior implements FlyBehavior{
@Override
public void fly() {
System.out.println(" 不会飞翔~~~~");
}
}
interface QuackBehavior{
void quack();//子类实现
}
abstract class Duck{
//属性, 策略接口
FlyBehavior flyBehavior;
//其它属性<->策略接口
QuackBehavior quackBehavior;
public Duck() {
}
//显示鸭子信息
abstract void display();
void quack(){
System.out.println("鸭子嘎嘎叫~~");
}
void swim(){
System.out.println("鸭子会游泳~~");
}
public void fly() {
//改进
if(flyBehavior != null) {
flyBehavior.fly();
}
}
public FlyBehavior getFlyBehavior() {
return flyBehavior;
}
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public QuackBehavior getQuackBehavior() {
return quackBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
class PekingDuck extends Duck {
//假如北京鸭可以飞翔,但是飞翔技术一般
public PekingDuck() {
flyBehavior = new BadFlyBehavior();
}
@Override
public void display() {
System.out.println("~~北京鸭~~~");
}
}
//玩具鸭
class ToyDuck extends Duck{
public ToyDuck() {
flyBehavior = new NoFlyBehavior();
}
@Override
public void display() {
System.out.println("玩具鸭");
}
//需要重写父类的所有方法
public void quack() {
System.out.println("玩具鸭不能叫~~");
}
public void swim() {
System.out.println("玩具鸭不会游泳~~");
}
}
//野鸭
class WildDuck extends Duck {
//构造器,传入FlyBehavor 的对象
public WildDuck() {
flyBehavior = new GoodFlyBehavior();
}
@Override
public void display() {
System.out.println(" 这是野鸭 ");
}
}