美文网首页
策略模式

策略模式

作者: 请叫我刚爷 | 来源:发表于2019-12-13 20:03 被阅读0次

策略模式

策略模式分如下几步:
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();   
    }

相关文章

网友评论

      本文标题:策略模式

      本文链接:https://www.haomeiwen.com/subject/fgrqnctx.html