1.鸭子的所有的飞行的和叫声的接口
public interface FlyBehavior {
public void fly();//所有飞行行为都要实现接口
}
public interface QuackBehavior {
public void quack();
}
2.飞行的实现类
public class CanFly implements FlyBehavior {
@Override
public void fly() {
System.out.println("我会飞");
}
}
public class NoFly implements FlyBehavior {
@Override
public void fly() {
System.out.println("我不会飞");
}
}
3.叫声的实现类
public class CanQuack implements QuackBehavior {
@Override
public void quack() {
System.out.println("我会叫");
}
}
public class NoQuack implements QuackBehavior {
@Override
public void quack() {
System.out.println("我不会叫");
}
}
4.通用的鸭子抽象类(1.引入两个接口作为变量 2.抽象类具体实现有接口变量委托执行)
public abstract class MyDuck {//抽象类
//行为接口的两个引用变量
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
public MyDuck() {
}
public abstract void display();//抽象方法
public void swim(){
System.out.println("所有的鸭子都会游泳");
}
/**
* 委托行为类
*/
public void performFly(){
flyBehavior.fly();
}
public void performQuack(){
quackBehavior.quack();
}
}
5.具体鸭子的实现类(继承模板类)
public class ModelDuak extends MyDuck{
public ModelDuak() {//构造方法内给父类的接口变量具体肤质实现类,创建属性
flyBehavior=new NoFly();//创建的时候已经规定了属性
quackBehavior=new CanQuack();
}
@Override
public void display() {
// EnumSet
System.out.println("我是模型");
}
}
6.测试
public class DuckTest {
public static void main(String[] args) {
MyDuck duck=new ModelDuak();//多态,模型鸭
duck.performFly();
duck.performQuack();
duck.performFly();
}
}
7.思考:飞行接口有一个新的属性能像火箭一样进行飞行,代码如何实现,策略模式如何实现
7.1火箭行为实现飞行接口
public class FlyRocketPower implements FlyBehavior {
@Override
public void fly() {
System.out.println("我能飞,我还有火箭系统");
}
}
给已有代码的飞行属性修改为火箭飞行的数据
因为通用鸭子的抽象类中的setQuackBehavior方法,可以在构造方法中给飞行接口赋值
7.2测试
public class DuckTest {
public static void main(String[] args) {
MyDuck duck=new ModelDuak();//多态,模型鸭
duck.performFly();
duck.performQuack();
duck.setFlyBehavior(new FlyRocketPower());
duck.performFly();
}
}
8.总结,可以不同的实现类作为不同的算法,在不改变源代码的情况下,给相同的类赋值给不同的算法