鸭子(Duck)类,不同的鸭子具有不同的叫和飞的行为,同时要便于产生新的鸭子对象,可为鸭子添加新的行为,易于维护,动态设置行为。
不同鸭子的行为:
RedHeadDuck:红头鸭,可以用翅膀飞,呱呱叫。
RubberDuck:橡皮鸭,不会飞,吱吱叫。
ModelDuck:模型鸭,不会飞,呱呱叫。
DecoyDuck:诱饵鸭,不会飞,不会叫。
MallardDuck:野鸭,会用翅膀飞,呱呱叫。
设计原则:
1、封装变化
2、针对接口编程,而不是针对实现编程。
3、多用组合、少用继承
测试类
package com.test;
import com.duck.DecoyDuck;
import com.duck.MallardDuck;
import com.duck.ModelDuck;
import com.duck.RubberDuck;
import com.fly.FlyRocketPowered;
public class MiniDuckSimulator {
public static void main(String[] args) {
MallardDuck mallard = new MallardDuck();
RubberDuck rubberDuckie = new RubberDuck();
DecoyDuck decoy = new DecoyDuck();
ModelDuck model = new ModelDuck();
mallard.display();
mallard.performQuack();
mallard.performFly();
rubberDuckie.display();
rubberDuckie.performQuack();
rubberDuckie.performFly();
decoy.display();
decoy.performQuack();
decoy.performFly();
model.display();
model.performQuack();
model.performFly();
model.setFlyBehavior(new FlyRocketPowered());
model.performFly();
/*
I'm a real Mallard duck.
Quack
I'm flying!!
I'm a rubber duckie.
Squeak
I can't fly
I'm a duck Decoy.
<< Silence >>
I can't fly
I'm a model duck.
Quack
I can't fly
I'm flying with a rocket
*/
}
}
鸭子超类与各种鸭子类
Duck
package com.duck;
import com.fly.FlyBehavior;
import com.quack.QuackBehavior;
/**
* 鸭子抽象类
* */
public abstract class Duck {
//行为由接口组合而来,而不是继承.不同的鸭子行为各不相同
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck() {
}
//行为动态设置
public void setFlyBehavior(FlyBehavior fb) {
flyBehavior = fb;
}
public void setQuackBehavior(QuackBehavior qb) {
quackBehavior = qb;
}
abstract void display(); //不同鸭子长相不同
//行为委托给具体的行为类处理
public void performFly()
{
flyBehavior.fly();
}
public void performQuack() {
quackBehavior.quack();
}
public void swim() {//所有的鸭子都会浮水
System.out.println("All ducks float,even decoys!");
}
}
DecoyDuck
package com.duck;
import com.fly.FlyNoWay;
import com.quack.MuteQuack;
/**
* 诱饵鸭,不会飞,不会叫
* */
public class DecoyDuck extends Duck {
public DecoyDuck() {
setFlyBehavior(new FlyNoWay());
setQuackBehavior(new MuteQuack());
}
public void display() {
System.out.println("I'm a duck Decoy.");
}
}
MallardDuck
package com.duck;
import com.fly.FlyWithWings;
import com.quack.Quack;
/**
* 野鸭,会用翅膀飞,呱呱叫
* */
public class MallardDuck extends Duck {
public MallardDuck() {
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
public void display() {
System.out.println("I'm a real Mallard duck.");
}
}
ModelDuck
package com.duck;
import com.fly.FlyNoWay;
import com.quack.Quack;
/**
* 模型鸭,不会飞,呱呱叫
* */
public class ModelDuck extends Duck {
public ModelDuck() {
flyBehavior = new FlyNoWay();
quackBehavior = new Quack();
}
public void display() {
System.out.println("I'm a model duck.");
}
}
RedHeadDuck
package com.duck;
import com.fly.FlyWithWings;
import com.quack.Quack;
/**
* 红头鸭,可以用翅膀飞,呱呱叫
* */
public class RedHeadDuck extends Duck {
public RedHeadDuck() {
flyBehavior = new FlyWithWings();
quackBehavior = new Quack();
}
@Override
void display() {
// TODO Auto-generated method stub
System.out.println("I'm a real Red Headed duck.");
}
}
RubberDuck
package com.duck;
import com.fly.FlyNoWay;
import com.quack.Squeak;
/**
* 橡皮鸭,不会飞,吱吱叫
* */
public class RubberDuck extends Duck {
public RubberDuck() {
flyBehavior = new FlyNoWay();
quackBehavior = new Squeak();
}
public void display() {
System.out.println("I'm a rubber duckie.");
}
}
飞行为接口与各种具体的飞行为类
FlyBehavior
package com.fly;
/**
* 鸭子飞行的行为接口
*/
public interface FlyBehavior {
public void fly();
}
FlyNoWay
package com.fly;
/**
* 不会飞
*/
public class FlyNoWay implements FlyBehavior {
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I can't fly");
}
}
FlyRocketPowered
package com.fly;
/**
* 用火箭助力飞
*/
public class FlyRocketPowered implements FlyBehavior{
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I'm flying with a rocket");
}
}
FlyWithWings
package com.fly;
/**
* 用翅膀飞
*/
public class FlyWithWings implements FlyBehavior {
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I'm flying!!");
}
}
叫行为接口与各种具体的叫行为类
QuackBehavior
package com.quack;
/**
*鸭子叫的行为接口
*/
public interface QuackBehavior {
public void quack();
}
FakeQuack
package com.quack;
/**
* 假叫
* */
public class FakeQuack implements QuackBehavior {
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("Qwak");
}
}
MuteQuack
package com.quack;
/**
* 不会叫
* */
public class MuteQuack implements QuackBehavior {
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("<< Silence >>");
}
}
Quack
package com.quack;
/**
* 呱呱叫
* */
public class Quack implements QuackBehavior {
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("Quack");
}
}
Squeak
package com.quack;
/**
* 吱吱叫
* */
public class Squeak implements QuackBehavior {
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("Squeak");
}
}
相关阅读:
策略模式(Strategy Pattern)(二):HeadFirst中鸭子的实现
http://blog.csdn.net/jialinqiang/article/details/8871327