- 意义:分别封装行为接口,实现算法组,超类里放行为接口对象,在子类里具体设定行为对象。原则就是:分离变化部分,封装接口,基于接口编程各种功能。此模式让行为算法的变化独立与算法的使用者。
-
UML:
image.png - 环境(Context)角色:持有一个Strategy的引用。
- 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个-
接口或抽象类实现。此角色给出所有的具体策略类所需的接口。 - 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
- 设计模型:鸭子
- 特点: 鸭子有的会飞,有的不会飞。有的会叫,有的不会叫。但都会游泳
鸭子基类设计:
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 SetQuackBehavoir(QuackBehavior qb) {
mQuackBehavior = qb;
}
public void SetFlyBehavoir(FlyBehavior fb) {
mFlyBehavior = fb;
}
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() {
// TODO Auto-generated method stub
System.out.println("--GoodFly--");
}
}
//不会飞
public class NoFlyBehavior implements FlyBehavior{
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("--NoFly--");
}
}
叫声行为组设计:
//叫声接口
public interface QuackBehavior {
void quack();
}
//嘎嘎叫
public class GaGaQuackBehavior implements QuackBehavior{
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("__GaGa__");
}
}
//咯咯叫
public class GeGeQuackBehavior implements QuackBehavior{
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("__GeGe__");
}
}
//不会叫
public class NoQuackBehavior implements QuackBehavior{
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("__NoQuack__");
}
}
实现了不同行为策略的鸭子
//绿头鸭会飞,还会嘎嘎叫
public class GreenHeadDuck extends Duck {
public GreenHeadDuck() {
mFlyBehavior = new GoodFlyBehavior();
mQuackBehavior = new GaGaQuackBehavior();
}
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println("**GreenHead**");
}
}
//红头鸭子不会飞,但是会咯咯叫
public class RedHeadDuck extends Duck {
public RedHeadDuck() {
mFlyBehavior = new BadFlyBehavior();
mQuackBehavior = new GeGeQuackBehavior();
}
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println("**RedHead**");
}
}
有了这些行为组之后,我们在定义具体的鸭子时,只需要组合不同的具体行为,父类就能帮我们调用具体的行为。这样的好处,子类能充分复用共同的行为代码,并且能够随意组合各种行为,还将变化的行为分离出来,对行为的扩展是开发的。
网友评论