策略模式:分别封装行为接口,实现算法族,超类里放行为接口对象,在子类里具体设定行为对象,原则就是,分离变化部分,封装接口,基于接口编程各种功能。此模式让行为算法的变化独立于算法的使用者。
策略模式注意点:
1.分析项目中变化部分与不变部分
2.多用组合少用继承,用行为类组合,而不是行为的继承,更有弹性。
3.有些库或者框架本身就是某种设计模式
1.超类中的两个行为接口对象
public interface FlyBehavior {
void fly();
}
public interface QuackBehavior {
void quack();
}
2.两个行为接口对象的实现
public class GoodFlyBehavior implements FlyBehavior{
@Override
public void fly() {
System.out.println("good fly");
}
}
public class BadFlyBehavior implements FlyBehavior{
public void fly(){
System.out.println("bad fly");
}
}
public class GaGaQuackBehavior implements QuackBehavior{
@Override
public void quack() {
System.out.println("GaGa");
}
}
public class NoQuackBehavior implements QuackBehavior{
@Override
public void quack() {
System.out.println("no 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 setmFlyBehavior(FlyBehavior mFlyBehavior) {
this.mFlyBehavior = mFlyBehavior;
}
public void setmQuackBehavior(QuackBehavior mQuackBehavior) {
this.mQuackBehavior = mQuackBehavior;
}
public void swim(){
System.out.println("im swim");
}
}
4.两个子类即不同颜色头的鸭子
public class GreenHeadDuck extends Duck{
public GreenHeadDuck(){
mFlyBehavior=new GoodFlyBehavior();
mQuackBehavior=new GaGaQuackBehavior();
}
public void display(){
System.out.println("greenhead duck");
}
}
public class RedHeadDuck extends Duck{
public RedHeadDuck(){
mFlyBehavior=new BadFlyBehavior();
mQuackBehavior=new GaGaQuackBehavior();
}
public void display(){
System.out.println("Redhead duck");
}
}
5.测试类
public class DuckTest {
public static void main(String[] args) {
Duck mGreenHeadDuck=new GreenHeadDuck();
Duck mRedHeadDuck=new RedHeadDuck();
mGreenHeadDuck.display();
mGreenHeadDuck.Fly();
mGreenHeadDuck.Quack();
mGreenHeadDuck.swim();
mRedHeadDuck.display();
mRedHeadDuck.Fly();
mRedHeadDuck.Quack();
mRedHeadDuck.swim();
mRedHeadDuck.display();
mRedHeadDuck.setmFlyBehavior(new GoodFlyBehavior());
mRedHeadDuck.Fly();
mRedHeadDuck.setmQuackBehavior(new NoQuackBehavior());
mRedHeadDuck.Quack();
}
}