本文共 2614 字,大约阅读时间需要 8 分钟。
策略模式:分别封装行为(算法)接口,超类里放行为(算法)接口,在子类里赋值具体行为(算法)对象。
原则:分离变化部分,封装接口,基于接口编程各种行为(算法)功能。 作用:此方法让行为(算法)的变化独立于行为(算法)的使用者。实现
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**"); }}
转载地址:http://dhaji.baihongyu.com/