java 策略模式

策略模式:

//鸭子

public interface Duck
{
public void sound();

public void move();

}

//小红鸭

public class redDuck extends Duck
{

public void sound()
{
system.out.println("小红鸭叫");
}

public void move()
{
system.out.println("小红鸭移动");
}

}

//小黑鸭

public class blackDuck extends Duck
{

public void sound()
{
system.out.println("小黑鸭叫");
}

public void move()
{
system.out.println("小黑鸭移动");
}

}

//假如你现在有一只小飞鸭子,有个新功能会飞,怎么把这个功能加进去。

继承------

直接在父类定义 fly()方法,其子类就会有,弊端是:今后有一只玩具鸭子,根本不能飞 因此不能用继承。

抽象类-----

会让子类强制覆盖这个方法,没覆盖就会报错, 弊端是:如果不需的话,会有大量的代码冗余

怎么写出能够灵活一点的代码,能够比较自由的扩展功能:

当出现这个问题的时候,很自然的会想到能不能定义一个类,这个类有一个fly()方法

当某个类需要飞行时候,引入具有飞行方法的类到某个类里面,

顺着这个思路,我们会想到,如果单单只是需要飞行,就定义一个类,这样会出现这样的问题,因为飞行是一个功能,

实现飞行的方式却有很多,因此我们应该考虑到把这个类编写成接口,而不是具体的实现类(这就是面像接口编程)

面向接口编程的优点是,接口只定于规则,比如飞,走,吃,但是不定义实现,比如你坐飞机飞,坐火箭飞,。。。都行

这就是面像接口编程)接口只负责定义规则,各种该规则的具体实现交给该接口的实现类


现在定义具有飞行的fly()功能,的接口

public interface Canfly
{

void fly();

}

定义一个用于使用策略的类


public class UserStrategy
{

private Canfly canfly
public UserStrategy(Canfly canfly)
{

this.canfly = canfly;

}

public void fly()
{

system.out.println("小飞鸭飞");

}

}

 


//定义小飞鸭

public class FlyDuck extends Duck implememnts Canfly
{

Private UserStrategy userStrategy;

public Duck(Duck duck)
{

this.duck=duck;

}

public void sound()
{
system.out.println("小飞鸭叫");
}

public void move()
{
system.out.println("小飞鸭移动");
}

}


public class DemoTest
{
public static void main(String [] args)
{

Canfly flyduck = new Duck(new FlyDuck);

flyduck.fly();

}
}

posted @ 2016-12-21 12:00  半仙人  阅读(168)  评论(0编辑  收藏  举报