java 策略模式

策略模式 定义了算法族,分别封装起来,让他们之间能够互相替换,此模式让算法的变化独立于使用算法的客户。
例子:要设计一套成功的模拟鸭子游戏:SimUDuck.游戏中会出现各类鸭子,一边游泳戏水,一边呱呱叫。可是有些鸭子是否是通常的鸭子,例如橡皮鸭子(会叫不会飞),木头鸭子(不会飞也不会叫),若是全部鸭子都继承Duck,那么不少方法要覆盖掉,不经过继承又实现不了代码的通用。
class Duck{
quack();
swim();
display();
flay();
}
那么咱们应该这样,找出应用中可能须要变化之处,把它们单独出来,不要和那些不须要变化的代码混合在一块儿,这也是咱们须要掌握的设计原则。
咱们知道Duck类内的fly()和quack()会随着鸭子的不一样而改变。
如今Duck类仍是全部鸭子的超类,可是飞行和呱呱叫的行为已经取出来,放在别的类的结构中。
那么如何设计那组实现飞行和呱呱叫的行为的类呢?
咱们但愿一切能有弹性 ,毕竟,正是由于一开始鸭子行为没有弹性,才让咱们走上如今这条路的。咱们还想可以“指定”行为到鸭子的实例。好比说,咱们想要产生一个新的绿头鸭实例,并指定特定类型的飞行行为给它。干脆随便让鸭子的行为能够动态地改变好了,换句话说,咱们应该在鸭子类中包含设定行为的方法,这样就能够在“运行时”动态地“改变”绿头鸭子的飞行行为。
因此咱们应该 针对接口编程,而不是针对实现编程
“针对实现编程”
Dog d=new Dog();
d.bark();
而“针对接口/超类型编程”
Animal animal=new Dog();
animal.makeSound();
因此,在此,咱们有两个接口,FlyBehavior和QuackBehavior,还有它们对应的类,负责实现具体的行为:
 interface FlyBehavior{
fly();
}
这是一个接口,全部的飞行类都实现它,全部新的飞行类都必须实现fly()方法。
class FlyWithWings implements  FlyBehavior{
fly(){
//实现鸭子飞行
}
}
class FlyNoWay implements  FlyBehavior{
fly(){
//什么都不会作,不会飞
}
}
这样一来,有了继承的"复用"好处,却没有继承带来的包袱。(这样的设计,可让飞行和呱呱叫的动做被其余的对象复用,由于这些行为已经与鸭子类无关了,而咱们能够新增一些行为,不会影响到既有的行为类,也不会影响”使用“到飞行行为的鸭子类 )
下面是到整合鸭子的行为了
class Duck{
FlyBehavior flyBehavior;//飞行行为
public void performFly(){
flyBehavior.fly();
}
}
而后继续Duck类即可以了。
public class MallardDuck extends{
public MallardDuck(){
flyBehavior=new FlyWithWings();
}
}
public class Test{
public static void main(String[] args){
   Duck d=new MallardDuck();
   d.fly();
}

} 算法

相关文章
相关标签/搜索