策略模式
策略模式分如下几步:
1、 分别封装行为接口,实现算法族。
2、 超类里放行为接口对象。
3、 在子类里具体设定行为对象。
列:
鸭子:有白毛鸭、红毛鸭、东北鸭等等。这些鸭子中有的鸭子会飞,有的不会飞.。有的会游泳,有的不会游泳等等。
1、 分别封装行为接口,实现算法族。
定义一个“飞”的接口,由子类具体实现各种飞的方法,会飞、不会飞、单飞、群飞。。。等等。这就是一个算法族;
游泳,也一样,定义一个“游泳”的接口,由子类具体实现各种游泳的方法,蝶泳、仰泳、狗刨都可以。这也是一个算法族
这里偷个懒,只写了个飞的算法族。
/**
* 定义鸭子的飞行属性
*/
public interface FlyObj
{
void fly();
}
//飞行方法
public class CanFly implements FlyObj
{
@Override
public void fly() {
System.out.println("--我可以飞了--");
}
}
//不会飞
public class NoFly implements FlyObj
{
@Override
public void fly() {
System.out.println("--我还不会飞--");
}
}
2、 超类里放行为接口对象。
定义一个鸭类的祖先,这个类包含所有算法族,只要你定义了想放进去就放。
public abstract class Duck {
FlyObj myfly; //飞算法族
public Duck() {
}
//鸭祖先的飞方法
public void Fly() {
myfly.fly();
}
//更改会不会飞
public void SetFlyObj(FlyObj fb) {
myfly= fb;
}
}
3、 在子类里具体设定行为对象。
各种鸭子继承鸭祖先的算法族,子类选择实现算法族的各种方法
public class CanFlyDuck extends Duck {
//实现算法族的飞的接口
public GreenHeadDuck() {
myfly= new CanFly();
}
}
public class NoFlydDuck extends Duck {
//实现算法族的不会飞的接口
public RedHeadDuck() {
myfly= new NoFly();
}
}
4、测试
public static void main(String[] args) {
Duck canFly = new CanFlyDuck();
Duck noFly = new NoFlydDuck();
canFly.Fly();
noFly.Fly();
canFly.SetFlyBehavoir(new NoFly());
canFly.Fly();
}
网友评论