package com.alvin.strategy;
import com.alvin.strategy.behavior.FlyBehavior;
import com.alvin.strategy.behavior.QuackBehavior;
public abstract class Duck {
protected FlyBehavior flyBehavior;
protected QuackBehavior quackBehavior;
public void swim(){
System.out.println("swim");
}
abstract public void display();
public void setFlyBehavior(FlyBehavior flyBehavior){
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior){
this.quackBehavior = quackBehavior;
}
public void performFly() {
flyBehavior.fly();
}
public void performQuack() {
quackBehavior.quack();
}
}
package com.alvin.strategy.subduck;
import com.alvin.strategy.Duck;
import com.alvin.strategy.behavior.impl.FlyWithWings;
import com.alvin.strategy.behavior.impl.Quack;
public class MallardDuck extends Duck{
public MallardDuck(){
flyBehavior = new FlyWithWings();
quackBehavior = new Quack();
}
@Override
public void display() {
System.out.println("MallardDuck");
}
}
package com.alvin.strategy.subduck;
import com.alvin.strategy.Duck;
import com.alvin.strategy.behavior.impl.FlyWithWings;
import com.alvin.strategy.behavior.impl.Squeak;
public class RedheadDuck extends Duck {
public RedheadDuck(){
flyBehavior = new FlyWithWings();
quackBehavior = new Squeak();
}
@Override
public void display() {
System.out.println("RedheadDuck");
}
}
package com.alvin.strategy.behavior;
public interface FlyBehavior {
void fly();
}
package com.alvin.strategy.behavior;
public interface QuackBehavior {
void quack();
}
package com.alvin.strategy.behavior.impl;
import com.alvin.strategy.behavior.FlyBehavior;
public class FlyNoWay implements FlyBehavior{
@Override
public void fly() {
System.out.println("FlyNoWay");
}
}
package com.alvin.strategy.behavior.impl;
import com.alvin.strategy.behavior.FlyBehavior;
public class FlyWithWings implements FlyBehavior{
@Override
public void fly() {
System.out.println("FlyWithWings");
}
}
package com.alvin.strategy.behavior.impl;
import com.alvin.strategy.behavior.QuackBehavior;
public class MuteQuack implements QuackBehavior {
@Override
public void quack() {
System.out.println("MuteQuack");
}
}
package com.alvin.strategy.behavior.impl;
import com.alvin.strategy.behavior.QuackBehavior;
public class Quack implements QuackBehavior{
@Override
public void quack() {
System.out.println("Quack");
}
}
package com.alvin.strategy.behavior.impl;
import com.alvin.strategy.behavior.QuackBehavior;
public class Squeak implements QuackBehavior{
@Override
public void quack() {
System.out.println("Squeak");
}
}
package com.alvin.strategy;
import com.alvin.strategy.behavior.impl.Squeak;
import com.alvin.strategy.subduck.MallardDuck;
public class Run {
public static void main(String[] args) {
Duck duck = new MallardDuck();
duck.performFly();
duck.performQuack();
duck.setQuackBehavior(new Squeak());
duck.performQuack();
}
}
運行結果Quack
Squeak