策略设计模式

一. 定义

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

二. 模式起源


三. 设计原则 

3.1 原则1

     把会变的部分取出并封装起来,以便以后可以轻易地改动或扩充此部分,而不影响不会变化 的部分。

3.2 原则2

     使用多态,针对接口编程,而非针对实现编程。

3.3 原则3

      多用组合,少用继承。

四. UML图

    

五. 代码

   5.1 Duck父类和子类
public abstract class Duck {

    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;

    public void swim() {
        System.out.println("all duck can swim~");
    }

    public abstract void display();

    public void performFly() {
        this.flyBehavior.fly();
    }

    public void performQuack() {
        this.quackBehavior.quack();
    }

    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;
    }
}
public class ADuck extends Duck {

    public ADuck() {
        super.flyBehavior = new AFly();
        super.quackBehavior = new AQuack();
    }

    @Override
    public void display() {
        System.out.println("A display...");
    }

}
public class BDuck extends Duck {

    public BDuck() {
        super.flyBehavior = new BFly();
        super.quackBehavior = new BQuack();
    }

    @Override
    public void display() {
        System.out.println("B display...");
    }

}
public class CDuck extends Duck {

    public CDuck() {
        super.flyBehavior = new CFly();
        super.quackBehavior = new CQuack();
    }

    @Override
    public void display() {
        System.out.println("C display...");
    }
}
public class DDuck extends Duck {

    public DDuck() {
        super.flyBehavior = new DFly();
        super.quackBehavior = new DQuack();
    }

    @Override
    public void display() {
        System.out.println("D display...");
    }

}
5.2 飞行行为接口及实现
public interface FlyBehavior {

    public abstract void fly();

}
public class AFly implements FlyBehavior {

    @Override
    public void fly() {
        System.out.println("A fly.....");
    }
}
public class BFly implements FlyBehavior {

    @Override
    public void fly() {
        System.out.println("B fly...");
    }
}
public class CFly implements FlyBehavior {

    @Override
    public void fly() {
        System.out.println("C fly...");
    }
}
public class DFly implements FlyBehavior {

    @Override
    public void fly() {
        System.out.println("D fly...");
    }

}
5.3 叫行为接口及其实现
public interface QuackBehavior {

    public abstract void quack();

}
public class AQuack implements QuackBehavior {

    @Override
    public void quack() {
        System.out.println("A quack...");
    }

}
public class BQuack implements QuackBehavior {

    @Override
    public void quack() {
        System.out.println("B quack...");
    }
}
public class CQuack implements QuackBehavior {

    @Override
    public void quack() {
        System.out.println("C quack...");
    }
}
public class DQuack implements QuackBehavior {

    @Override
    public void quack() {
        System.out.println("D quack...");
    }
}
5.4 测试
public class Main {

    public static void main(String[] args) {

        Duck aDuck = new ADuck();
        aDuck.performFly();
        aDuck.performQuack();

        // 如果想切换飞或叫行为 直接set即可
        aDuck.setFlyBehavior(new BFly());
        aDuck.setQuackBehavior(new BQuack());
        aDuck.performFly();
        aDuck.performQuack();
    }

}
5.5 结果
A fly.....
A quack...
B fly...
B quack...

六. 感悟

       如果需要实现别的飞方式或者叫方式,创建新类添加即可。易扩展。还可以动态切换。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值