一基础
抽象 封装 多态 继承
二OO原则
封装变化
多用组合,少用继承
针对接口编程,不针对实现编程
三OO模式
策略模式----定义算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户
代码如下:
package com.headfirst.firstlesson.test;
public abstract class Duck
{
protected FlyBehavior flyBehavior;
protected QuackBehavior quackBehavior;
public abstract void display();
public void performFly()
{
flyBehavior.fly();
}
public void setFlyBehavior(FlyBehavior flyBehavior)
{
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior)
{
this.quackBehavior = quackBehavior;
}
public void performQuack()
{
quackBehavior.quack();
}
public void swim()
{
System.out.println("All ducks float,even decoys!");
}
}
package com.headfirst.firstlesson.test;
public interface FlyBehavior
{
public void fly();
}
package com.headfirst.firstlesson.test;
public interface QuackBehavior
{
public void quack();
}
package com.headfirst.firstlesson.test;
public class FlyNoWay implements FlyBehavior
{
@Override
public void fly()
{
System.err.println("I'm can't fly");
}
}
package com.headfirst.firstlesson.test;
public class FlyRocketPowered implements FlyBehavior
{
@Override
public void fly()
{
System.out.println("I'm flying with a rocket!");
}
}
package com.headfirst.firstlesson.test;
public class FlyWithWings implements FlyBehavior
{
@Override
public void fly()
{
System.out.println("I'm Flying!!!");
}
}
package com.headfirst.firstlesson.test;
public class MuteQuack implements QuackBehavior
{
@Override
public void quack()
{
System.out.println("<< Silence >>");
}
}
package com.headfirst.firstlesson.test;
public class Quack implements QuackBehavior
{
@Override
public void quack()
{
System.out.println("Quack");
}
}
package com.headfirst.firstlesson.test;
public class Squeak implements QuackBehavior
{
@Override
public void quack()
{
System.out.println("Squeak");
}
}
package com.headfirst.firstlesson.test;
public class MallardDuck extends Duck
{
public MallardDuck()
{
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
@Override
public void display()
{
System.out.println("I'm a real Mallard duck");
}
}
package com.headfirst.firstlesson.test;
public class ModelDuck extends Duck
{
public ModelDuck()
{
quackBehavior = new Quack();
flyBehavior = new FlyNoWay();
}
@Override
public void display()
{
System.out.println("I'm a model duck");
}
}
测试类
package com.headfirst.firstlesson.test;
public class MiniQuckSimulator
{
public static void main(String[] args) throws Exception
{
Duck mallard = new MallardDuck();
mallard.performFly();
mallard.performQuack();
Thread.sleep(1000);
System.out.println("---------------------------------");
Duck model = new ModelDuck();
model.performFly();
model.setFlyBehavior(new FlyRocketPowered());
model.performFly();
}
}
单步调试时候:
直接运行的时候不知道为什么结果不确定。
或者
或者还有其他结果