- publicabstractclassDuck{
- FlyBehaviorflyBehavior;
- QuackBehaviorquackBehavior;
- publicDuck(){
- }
- publicvoidsetFlyBehavior(FlyBehaviorfb){
- flyBehavior=fb;
- }
- publicvoidsetQuackBehavior(QuackBehaviorqb){
- quackBehavior=qb;
- }
- abstractvoiddisplay();
- publicvoidperformFly(){
- flyBehavior.fly();
- }
- publicvoidperformQuack(){
- quackBehavior.quack();
- }
- publicvoidswim(){
- System.out.println("Allducksfloat,evendecoys!");
- }
- }
- publicinterfaceFlyBehavior{
- publicvoidfly();
- }
- publicinterfaceQuackBehavior{
- publicvoidquack();
- }
- publicclassFlyWithWingsimplementsFlyBehavior{
- publicvoidfly(){
- System.out.println("I'mflying!!");
- }
- }
- publicclassRedHeadDuckextendsDuck{
- publicRedHeadDuck(){
- flyBehavior=newFlyWithWings();//子类中改变实现,且互不影响。
- quackBehavior=newQuack();
- }
- publicvoiddisplay(){
- System.out.println("I'marealRedHeadedduck");
- }
- }
测试代码如下:
RedHeadDuck redHeadDuck = new RedHeadDuck();
redHeadDuck.performFly();
redHeadDuck.display();
输出结果:
I'm flying!!
I'm a real Red Headed duck
下面我们可以实现其他飞的方式,例如乘火箭
- publicclassFlyRocketPoweredimplementsFlyBehavior{
- publicvoidfly(){
- System.out.println("I'mflyingwitharocket");
- }
- }
测试代码:
RedHeadDuck redHeadDuck = new RedHeadDuck();
redHeadDuck.setFlyBehavior(new FlyRocketPowered());
redHeadDuck.display();
redHeadDuck.performFly();
输出结果:
I'm a real Red Headed duck
I'm flying with a rocket
小结:
可见策略模式定义了算法,将他们分别封装,他们之间可以相互替换。(例如:FlyWithWings和FlyRocketPowered)
这样每个实现都相互不影响。