策略模式:分别封装行为(算法)接口,超类里放行为(算法)接口,在子类里赋值具体行为(算法)对象。 原则:分离变化部分,封装接口,基于接口编程各种行为(算法)功能。 作用:此方法让行为(算法)的变化独立于行为(算法)的使用者。
实现
public abstract class Duck {
public Duck() {
}
public void Quack() {
System.out.println("~~gaga~~");
}
public abstract void display();
public void swim() {
System.out.println("~~im swim~~");
}
public void Fly() {
System.out.println("~~im fly~~");
}
}public class GreenHeadDuck extends Duck {
@Override
public void display() {
System.out.println("**GreenHead**");
}
public void Fly() {
System.out.println("~~no fly~~");
}
}public class RedHeadDuck extends Duck {
@Override
public void display() {
System.out.println("**RedHead**");
}
// public void Fly() {
// System.out.println("~~good fly~~");
// }
}public class StoneDuck extends Duck {
@Override
public void display() {
System.out.println("**StoneDuck**");
}
public void Quack() {
System.out.println("~~no gaga~~");
}
public void swim() {
System.out.println("~~no swim~~");
}
public void Fly() {
System.out.println("~~no fly~~");
}
}当我们要扩展一个行为的时候,例如fly, 1、使用继承的时候,fly()的实现放在超类,优点是代码的复用,缺点是有功能溢出; 2、不使用继承的时候,fly()在各个子类中实现,缺点是代码复用性不好; 为解决以上两点,就用行为的组合,不用行为的继承;既满足代码复用,也满足不功能溢出。
1)、分析问题的变化部分和不变部分,提取变化部分,抽象成接口+实现; 2)、鸭子哪些功能是会根据新需求变化的?叫声/飞行。。。
例如: 1、接口: 1)、飞行的接口:
public interface FlyBehavior{
void fly();
}2)、叫声的接口
public interface QuackBehavior {
void quack();
}3)好处:新增行为简单,行为类更好的复用,组合更方便。既有继承带来的复用好处,没有挖坑
public abstract class Duck {
FlyBehavior mFlyBehavior;
QuackBehavior mQuackBehavior;
public Duck() {}
public void Fly() {
mFlyBehavior.fly();
}
public void Quack() {
mQuackBehavior.quack();
}
public abstract void display();
public void swim() {
System.out.println("~~im swim~~");
}public interface FlyBehavior {
void fly();`在这里插入代码片`
}public class BadFlyBehavior implements FlyBehavior
{
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("--BadFly--");
}
}public class GoodFlyBehavior implements FlyBehavior
{
@Override
public void fly() {
System.out.println("--GoodFly--");
}
}public class NoFlyBehavior implements FlyBehavior
{
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("--NoFly--");
}
}public class GreenHeadDuck extends Duck {
public GreenHeadDuck() {
mFlyBehavior = new GoodFlyBehavior();
mQuackBehavior = new GaGaQuackBehavior();
}
@Override
public void display() {
System.out.println("**GreenHead**");
}
}