1.策略模式定义:
策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
2.设计 一个鸭子类(使用策略模式)
建议先看参考资料1,再看这个例子。
将鸭子的行为(飞行行为,呱呱叫行为)分别抽象为FlaBehavior,QuackBehavior接口。然后分别对这二个接口实现(FlyWithWings,FlyNoWay)(Quack,Squeak,MuteQuack)。在鸭子类中分别包含二个变量(FlaBehavior flaBehavior, QuackBehavior quackBehavior),和对应设置方法(setFlaBehavior , setQuackBehavior ).还有就是对应的具体的执行操作(performFly, performQuack)。这样的话,我们就可以动态的改变鸭子的行为,这其实也就是策略模式的核心:动态的,让行为(也可以说是算法族)互相替换。
UML图:
详细源码:
(1).FlyBehavior.java
//飞行接口
public interface FlyBehavior{
//飞行
public void fly();
}
(2)FlyWithWings.java
//飞行类
public class FlyWithWings implements FlyBehavior{
@Override
public void fly() {
// TODO Auto-generated method stub
//实现飞行
System.out.println("FlyWithWings----fly()");
}
}
(3)FlyNoWay.java
//不飞行类
public class FlyNoWay implements FlyBehavior{
@Override
public void fly() {
// TODO Auto-generated method stub
//什么事都不做,飞不起来
System.out.println("FlyNoWay----fly()");
}
}
(4)QuackBehavior.java
//呱呱叫接口
public interface QuackBehavior{
//呱呱叫
public void quack();
}
(5)Quack.java
//呱呱叫类
public class Quack implements QuackBehavior{
@Override
public void quack() {
// TODO Auto-generated method stub
//呱呱叫
System.out.println("Quack----quack()");
}
}
(6)Squeak.java
//吱吱叫类
public class Squeak implements QuackBehavior{
@Override
public void quack() {
// TODO Auto-generated method stub
//吱吱叫
System.out.println("Squeak----quack()");
}
}
(7)MuteQuack.java
//不叫类
public class MuteQuack implements QuackBehavior{
@Override
public void quack() {
// TODO Auto-generated method stub
//不叫
System.out.println("MuteQuack----quack()");
}
}
(8)Duck.java
//鸭子类
public abstract class Duck{
private FlyBehavior flyBehavior;
private QuackBehavior quackBehavior;
public void setFlyBehavior(FlyBehavior flyBehavior){
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior){
this.quackBehavior = quackBehavior;
}
public void performFly(){
flyBehavior.fly();
}
public void performQuack(){
quackBehavior.quack();
}
public abstract void display();
public void swim(){
System.out.println("swim");
}
}
(9)TestDuck
//测试鸭子类
public class TestDuck extends Duck{
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println(" 我是一个 测试鸭子类");
}
}
(10)测试验证:
public class Test{
public static void main(String[] args){
Duck test = new TestDuck();
test.display();
test.swim();
test.setFlyBehavior(new FlyWithWings());
test.performFly();
test.setFlyBehavior(new FlyNoWay());
test.performFly();
test.setQuackBehavior(new Quack());
test.performQuack();
test.setQuackBehavior(new Squeak());
test.performQuack();
test.setQuackBehavior(new MuteQuack());
test.performQuack();
}
}
测试结果:
我是一个 测试鸭子类
swim
FlyWithWings----fly()
FlyNoWay----fly()
Quack----quack()
Squeak----quack()
MuteQuack----quack()
3.设计原则
1.找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起
2.针对接口编程,而不是针对实现编程
针对接口编程也可以明确的说成变量的类型应该是超类型,通常是一个抽象类或者是一个接口。
3.多用组合,少用继承
4.参考资料:
1.设计模式(二十一)----- 策略模式(Strategy)----(JAVA版)
http://blog.csdn.net/hfreeman2011/article/details/8502153
2.Head First设计模式(中文版),中国电力出版社出版,O‘REILLY公司译----(1--35页)---策略模式