策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
几个设计原则:
1、把会变化的部分取出并
封装起来,以便以后可以轻易地改动或扩充此部分,而不影响不需要变化的其他部分;
2、针对
接口编程,而不是针对实现编程。这样就可以在“运行时”动态地“改变”行为。(因为接口中的方法可以通过不同的类实现,在运行时再调用各种不同的实现的类);
3、多用
组合,少用
继承。这样可以获得更大的弹性。
以上三点实际是相互联系的,
封装即用到
接口,用不同的类实现接口中定义的方法,让其他类使用,即
组合。
我突然想到了“DAO”,还不是很了解,有空研究下。
在第一章的例子中:鸭子继承Duck,飞行行为实现FlyBehavior接口,呱呱叫行为实现QuackBehavior接口。文中的“一组行为”更为通俗的说法为“
一族算法”。
本章所有代码如下:
FlyBehavior接口(FlyBehavior.java):
public interface FlyBehavior {
public void fly();
}
public void fly();
}
实现Flybehavior接口的三个类:
FlyWithWings.java
public class FlyWithWings implements FlyBehavior {
public void fly(){
System.out.println("I'm flying !!!");
}
}
public void fly(){
System.out.println("I'm flying !!!");
}
}
FlyNoWay.java
public class FlyNoWay implements FlyBehavior{
public void fly(){
System.out.println("I can't fly.");
}
}
public void fly(){
System.out.println("I can't fly.");
}
}
FlyRocketPowered.java
public class FlyRocketPowered implements FlyBehavior{
public void fly(){
System.out.println("I'm flying with a rocket!");
}
}
public void fly(){
System.out.println("I'm flying with a rocket!");
}
}
QuackBehavior接口:
public interface QuackBehavior {
public void quack();
}
public void quack();
}
实现QuackBehavior接口的三个类:
Quack.java
public class Quack implements QuackBehavior{
public void quack(){
System.out.println("Quack");
}
}
public void quack(){
System.out.println("Quack");
}
}
Squeak.java
public class Squeak implements QuackBehavior{
public void quack(){
System.out.println("Squeak");
}
}
public void quack(){
System.out.println("Squeak");
}
}
MuteQuack.java
public class MuteQuack implements QuackBehavior{
public void quack(){
System.out.println("<< Silence >>");
}
}
public void quack(){
System.out.println("<< Silence >>");
}
}
Duck抽象超类(Duck.java):
public abstract class Duck {
FlyBehavior flybehavior;
QuackBehavior quackbehavior;
public abstract void display();
public void performFly(){
flybehavior.fly();
}
public void performQuack(){
quackbehavior.quack();
}
FlyBehavior flybehavior;
QuackBehavior quackbehavior;
public abstract void display();
public void performFly(){
flybehavior.fly();
}
public void performQuack(){
quackbehavior.quack();
}
/*为了可以在运行时动态地设定行为*/
public void setFlyBehavior(FlyBehavior fb){
flybehavior = fb;
}
public void setFlyBehavior(FlyBehavior fb){
flybehavior = fb;
}
/*为了可以在运行时动态地设定行为*/
public void setQuackBehavior(QuackBehavior qb){
quackbehavior = qb;
}
public void swim(){
System.out.println("All duck float, even decoys !");
}
}
MallardDuck子类(MallardDuck.java)
public class MallardDuck extends Duck{
public MallardDuck(){
this.quackbehavior = new Quack();
this.flybehavior = new FlyWithWings();
}
public void display(){
System.out.println("I'm a real Mallard duck");
}
public MallardDuck(){
this.quackbehavior = new Quack();
this.flybehavior = new FlyWithWings();
}
public void display(){
System.out.println("I'm a real Mallard duck");
}
}
ModelDuck子类(ModelDuck.java)
public class ModelDuck extends Duck{
public ModelDuck(){
this.flybehavior = new FlyNoWay();
this.quackbehavior = new Quack();
}
public void display(){
System.out.println("I'm a model duck");
}
}
public ModelDuck(){
this.flybehavior = new FlyNoWay();
this.quackbehavior = new Quack();
}
public void display(){
System.out.println("I'm a model duck");
}
}
主文件MiniDuckSimulator.java
public class MiniDuckSimulator {
public static void main(String[] args){
Duck mallard = new MallardDuck();
mallard.performQuack();
mallard.performFly();
Duck model = new ModelDuck();
model.performFly();
System.out.println("Now, reset fly behavior...");
model.setFlyBehavior(new FlyRocketPowered()); //动态地改变行为
System.out.println("Fly behavior resetted !");
model.performFly();
}
}
public static void main(String[] args){
Duck mallard = new MallardDuck();
mallard.performQuack();
mallard.performFly();
Duck model = new ModelDuck();
model.performFly();
System.out.println("Now, reset fly behavior...");
model.setFlyBehavior(new FlyRocketPowered()); //动态地改变行为
System.out.println("Fly behavior resetted !");
model.performFly();
}
}