设计模式作为前辈们的经验总结,对我们后辈来说是一份珍贵的宝藏。我不是模式的设计者,我只是模式的搬运工。
这篇博文主要是介绍一下策略模式的用法。
一般我们在开发的过程中,使用的比较多的是继承,如,子类继承父类,子类就拥有父类的成员变量以及行为方法,子类也需实现父类中的抽象方法。
继承作为java的三大特性之一,其作用也是相当的显著,不过也会带来一些问题:对类的局部改动,会影响其他部分,比如说影响会有溢出效应。所以呢,超类挖的一个坑,每个子类都要来填,增加工作量,时间的复杂度为:O(N^2)。由此我们引出第一个设计模式:策略模式。
策略模式:分别封装行为接口,实现算法族,超类里面放行为接口对象,在子类里面设定行为对象。原则是:分离变化部分,封装接口,基于接口编程各种功能。此模式让行为算法的变化独立于算法的使用者。
策略模式注意点:
1、分享项目中变化部分与不变部分
2、多用组合少用继承;用行为类组合,而不是行为的继承,从而使得设计更有弹性。
好了,话不多说,上代码:
接口代码:
package com.yuanqs.strategy;
public interface FlyBehavior {
void fly();
}
package com.yuanqs.strategy;
public interface QuackBehavior {
void quack();
}
实现类代码:
package com.yuanqs.strategy;
public class GoodFlyBehavior implements FlyBehavior {
@Override
public void fly() {
System.out.println(" I can fly good!!!");
}
}
package com.yuanqs.strategy;
public class BadFlyBehavior implements FlyBehavior {
@Override
public void fly() {
System.out.println(" I can fly bad");
}
}
package com.yuanqs.strategy;
public class GagaQuackBehavior implements QuackBehavior {
@Override
public void quack() {
System.out.println("my quack is gaga");
}
}
package com.yuanqs.strategy;
public class HahaQuackBehavior implements QuackBehavior {
@Override
public void quack() {
System.out.println("my quack is HAHA");
}
}
抽象类代码:
package com.yuanqs.strategy;
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public void fly(){
flyBehavior.fly();
}
public void quack(){
quackBehavior.quack();
}
public abstract void display();
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
子类代码:
package com.yuanqs.strategy;
public class GreeHeadDuck extends Duck {
public GreeHeadDuck() {
flyBehavior = new GoodFlyBehavior();
quackBehavior = new HahaQuackBehavior();
}
@Override
public void display() {
System.out.println("I am green");
}
}
package com.yuanqs.strategy;
public class RedHeadDuck extends Duck {
public RedHeadDuck() {
flyBehavior = new BadFlyBehavior();
quackBehavior = new GagaQuackBehavior();
}
@Override
public void display() {
System.out.println("I am red");
}
}
测试类代码:
package com.yuanqs.strategy;
public class Test {
public static void main(String[] args) {
Duck greenHeadDuck = new GreeHeadDuck();
Duck redHeadDuck = new RedHeadDuck();
greenHeadDuck.fly();
greenHeadDuck.quack();
greenHeadDuck.display();
redHeadDuck.fly();
redHeadDuck.quack();
redHeadDuck.display();
}
}