最近因为工作上的需求研究了一下策略者模式,所以写了个实例,下面是思想图:
主要的思想是多用组合少用继承,将行为抽象出来成对象。
下面是代码:
1.CelueModule
/**
* Created by saicy on 2017/3/31.
*/
public class CelueModule {
public static void main(String[] args) {
Duck duck = new RedDuck(new FlyWay(),new Quack());
duck.fly();
duck.quak();
Duck duck2 = new RubberDuck(new FlyNoWay(),new SQuack());
duck2.fly();
duck2.quak();
}
}
2.Duck
/**
* 鸭子类(策略模式)
* Created by saicy on 2017/3/31.
*/
public abstract class Duck {
//将鸭子的飞行行为封装起来,使用组合的来实现,这样的话会比较灵活。
private FlyBehavior flyBehavior;
//将鸭子的叫声行为封装起来,使用组合的方式来实现,这样的话会比较灵活。
private QuakBehavior quakBehavior;
public abstract void fly();
public abstract void quak();
}
3.FlyBehavior
/**
* 飞行接口
* Created by saicy on 2017/3/31.
*/
public interface FlyBehavior {
public void fly();
}
4.FlyNoWay
/**
* 实现飞行接口的不会飞类
* Created by saicy on 2017/3/31.
*/
public class FlyNoWay implements FlyBehavior {
@Override
public void fly() {
System.out.println("不会飞!");
}
}
5.FlyWay
/**
* 实现飞行的能飞接口
* Created by saicy on 2017/3/31.
*/
public class FlyWay implements FlyBehavior{
@Override
public void fly() {
System.out.println("实现鸭子的飞行!");
}
}
6.Quack
/**
* Created by saicy on 2017/3/31.
*/
public class Quack implements QuakBehavior{
@Override
public void quak() {
System.out.println("呱呱叫!");
}
}
7.QuakBehavior
/**
* 鸭子叫声动作
* Created by saicy on 2017/3/31.
*/
public interface QuakBehavior {
void quak();
}
8.RedDuck
/**
* 红头鸭
* Created by saicy on 2017/3/31.
*/
public class RedDuck extends Duck {
//将鸭子的飞行行为封装起来,使用组合的来实现,这样的话会比较灵活。
private FlyBehavior flyBehavior;
//将鸭子的叫声行为封装起来,使用组合的方式来实现,这样的话会比较灵活。
private QuakBehavior quakBehavior;
public RedDuck(FlyBehavior flyBehavior, QuakBehavior quakBehavior) {
super();
this.flyBehavior = flyBehavior;
this.quakBehavior = quakBehavior;
}
public FlyBehavior getFlyBehavior() {
return flyBehavior;
}
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public QuakBehavior getQuakBehavior() {
return quakBehavior;
}
public void setQuakBehavior(QuakBehavior quakBehavior) {
this.quakBehavior = quakBehavior;
}
@Override
public void fly() {
flyBehavior.fly();
}
@Override
public void quak() {
quakBehavior.quak();
}
}
10.RubberDuck
public class RubberDuck extends Duck {
//将鸭子的飞行行为封装起来,使用组合的来实现,这样的话会比较灵活。
private FlyBehavior flyBehavior;
//将鸭子的叫声行为封装起来,使用组合的方式来实现,这样的话会比较灵活。
private QuakBehavior quakBehavior;
public RubberDuck(FlyBehavior flyBehavior, QuakBehavior quakBehavior) {
super();
this.flyBehavior = flyBehavior;
this.quakBehavior = quakBehavior;
}
public FlyBehavior getFlyBehavior() {
return flyBehavior;
}
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public QuakBehavior getQuakBehavior() {
return quakBehavior;
}
public void setQuakBehavior(QuakBehavior quakBehavior) {
this.quakBehavior = quakBehavior;
}
@Override
public void fly() {
flyBehavior.fly();
}
@Override
public void quak() {
quakBehavior.quak();
}
}
11.SQuack
/**
* 橡皮鸭叫
* Created by saicy on 2017/3/31.
*/
public class SQuack implements QuakBehavior{
@Override
public void quak() {
System.out.println("橡皮鸭叫");
}
}
本代码是本人原创,谢谢大家的支持!~