本文共 4941 字,大约阅读时间需要 16 分钟。
1.问题引出
2.传统方案解决鸭子问题
package com.atguigu.strategy;public abstract class Duck { public Duck() { } public abstract void display();//显示鸭子信息 public void quack() { System.out.println("鸭子嘎嘎叫~~"); } public void swim() { System.out.println("鸭子会游泳~~"); } public void fly() { System.out.println("鸭子会飞翔~~~"); } }
package com.atguigu.strategy;public class PekingDuck extends Duck { @Override public void display() { // TODO Auto-generated method stub System.out.println("~~北京鸭~~~"); } //因为北京鸭不能飞翔,因此需要重写fly @Override public void fly() { // TODO Auto-generated method stub System.out.println("北京鸭不能飞翔"); }}
package com.atguigu.strategy;public class ToyDuck extends Duck{ @Override public void display() { // TODO Auto-generated method stub System.out.println("玩具鸭"); } //需要重写父类的所有方法 public void quack() { System.out.println("玩具鸭不能叫~~"); } public void swim() { System.out.println("玩具鸭不会游泳~~"); } public void fly() { System.out.println("玩具鸭不会飞翔~~~"); }}
package com.atguigu.strategy;public class WildDuck extends Duck { @Override public void display() { // TODO Auto-generated method stub System.out.println(" 这是野鸭 "); }}
package com.atguigu.strategy;public class Client { public static void main(String[] args) { // TODO Auto-generated method stub //测试 }}
3.传统的方式实现的问题分析和解决方案
4.策略模式
基本介绍策略模式的原理类图
策略模式:分别封装行为接口,实现算法族,超类里放行为接口对象,在子类里具体
设定行为对象。原则就是:分离变化部分,封装接口,基于接口编程各种功能。此模 式让行为的变化独立于算法的使用者5.策略模式解决鸭子问题
package com.atguigu.strategy.improve;public abstract class Duck { //属性, 策略接口 FlyBehavior flyBehavior; //其它属性<->策略接口 QuackBehavior quackBehavior; 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 void setFlyBehavior(FlyBehavior flyBehavior) { this.flyBehavior = flyBehavior; } public void setQuackBehavior(QuackBehavior quackBehavior) { this.quackBehavior = quackBehavior; } }
package com.atguigu.strategy.improve;public class PekingDuck extends Duck { //假如北京鸭可以飞翔,但是飞翔技术一般 public PekingDuck() { // TODO Auto-generated constructor stub flyBehavior = new BadFlyBehavior(); } @Override public void display() { // TODO Auto-generated method stub System.out.println("~~北京鸭~~~"); } }
package com.atguigu.strategy.improve;public class WildDuck extends Duck { //构造器,传入FlyBehavor 的对象 public WildDuck() { // TODO Auto-generated constructor stub flyBehavior = new GoodFlyBehavior(); } @Override public void display() { // TODO Auto-generated method stub System.out.println(" 这是野鸭 "); }}
package com.atguigu.strategy.improve;public class ToyDuck extends Duck{ public ToyDuck() { // TODO Auto-generated constructor stub flyBehavior = new NoFlyBehavior(); } @Override public void display() { // TODO Auto-generated method stub System.out.println("玩具鸭"); } //需要重写父类的所有方法 public void quack() { System.out.println("玩具鸭不能叫~~"); } public void swim() { System.out.println("玩具鸭不会游泳~~"); } }
package com.atguigu.strategy.improve;public interface FlyBehavior { void fly(); // 子类具体实现}
package com.atguigu.strategy.improve;public class NoFlyBehavior implements FlyBehavior{ @Override public void fly() { // TODO Auto-generated method stub System.out.println(" 不会飞翔 "); }}
package com.atguigu.strategy.improve;public class BadFlyBehavior implements FlyBehavior { @Override public void fly() { // TODO Auto-generated method stub System.out.println(" 飞翔技术一般 "); }}
package com.atguigu.strategy.improve;public class GoodFlyBehavior implements FlyBehavior { @Override public void fly() { // TODO Auto-generated method stub System.out.println(" 飞翔技术高超 ~~~"); }}
package com.atguigu.strategy.improve;public interface QuackBehavior { void quack();//子类实现}
package com.atguigu.strategy.improve;public class Client { public static void main(String[] args) { // TODO Auto-generated method stub WildDuck wildDuck = new WildDuck(); wildDuck.fly();// ToyDuck toyDuck = new ToyDuck(); toyDuck.fly(); PekingDuck pekingDuck = new PekingDuck(); pekingDuck.fly(); //动态改变某个对象的行为, 北京鸭 不能飞 pekingDuck.setFlyBehavior(new NoFlyBehavior()); System.out.println("北京鸭的实际飞翔能力"); pekingDuck.fly(); }}
6.策略模式在JDK-Arrays 应用的源码分析
JDK的 Arrays 的Comparator就使用了策略模式转载地址:http://zstzk.baihongyu.com/