设计模式一:策略模式

定义:策略模式定义了算法族(每一个行为的实现都是算法,合起来就是算法族),分别封装起来,让它们之间能够互相替换,此模式让算法的变化独立于使用算法的客户。java

设计原则:算法

一、找出应用中可能须要变化之处,把它们独立出来,不要和那些不须要的变化的代码混在一块儿编程

二、针对接口编程,而不是针对实现编程(利用多态)测试

三、多用组合,少用继承设计

每个鸭子都有一个FlyBehavior和QuackBehavior,能够将飞行和呱呱叫的行为都委托给它们处理。code

当两个类结合起来使用,就是组合。这种和继承的不一样在于,鸭子的行为不是继承来的,而是和适当的行为对象“组合”来的。orm

Duck类:对象

Duck.java
package com.sun;

public abstract class Duck {
	/*
	 * 下面两个类属于变化的部分
	 */
  //飞的类
  FlyBehavior flyBehavior;
  //叫的类
  QuackBehavior quackBehavior;
  public Duck(){
	  
  }
  public abstract void display();
  
  public void performFly(){
	  //委托给行为类
	  flyBehavior.fly();
  }
  
  public void performQuack(){
	  //委托给行为类
	  quackBehavior.quack();
  }
  /*
   * 增长另个新方法,实现动态设定行为
   */
  public void setFlyBehavior(FlyBehavior fb){
       //会经过接口(多态的表现形式之一)行为改变为相应的飞行行为(调用相应行为的方法)
	  flyBehavior = fb;
  }
  public void setQuackBehavior(QuackBehavior qb){
	  quackBehavior = qb;
  }
  public void swim(){
	  System.out.println("All ducks float,even decoys!");
  }
  
}

MallardDuck类:继承

package com.sun;

public class MallardDuck extends Duck{
  
	public MallardDuck(){
		//是对MallardDuck的具体实现
		quackBehavior = new Quack();
		flyBehavior = new FlywithWings();	
		
	}
	public void display(){
		System.out.println("I'm a real Mallard duck");
	}
}

ModelDuck类:接口

package com.sun;

public class ModelDuck extends Duck {
    
	public ModelDuck(){
		//经过具体实现测试,静态设定行为
		flyBehavior = new FlyNoWay();
		quackBehavior = new Quack();
	}
	
	public void display() {
		System.out.println("I'm a model duck");

	}

}

飞的行为接口

package com.sun;


/*
 * 飞的行为类
 */
public interface FlyBehavior {
  public void fly();
}

如下是飞的接口的三个实现类:

package com.sun;

public class FlyNoWay implements FlyBehavior {

	public void fly() {
		System.out.println("i can't fly!!");
	}

}

package com.sun;

public class FlyRocketPowered implements FlyBehavior {

	public void fly() {
		System.out.println("I'm fly with a rocket!");

	}

}

package com.sun;

public class FlywithWings implements FlyBehavior {

	public void fly() {
		System.out.println("I'm flying!!");

	}

}

QuackBehavior行为的接口:

package com.sun;

/*
 * 叫的行为类
 */
public interface QuackBehavior {
  public void quack();
}

如下是QuackBehavior接口的实现类:

package com.sun;

public class Quack implements QuackBehavior {

	public void quack() {
		System.out.println("quack!!");
	}
}

package com.sun;

public class Squeak implements QuackBehavior {

	public void quack() {
		System.out.println("quack");
	}

}
package com.sun;

public class MuteQuack implements QuackBehavior {

	public void quack() {
		System.out.println("<<>silence>");
	}
	

}

测试类:

package com.sun;

/*
 * 测试类
 */
public class MiniDuckSimulator {
	  public static void main(String[] args) {
		//静态设定行为
		Duck mallard = new MallardDuck();
		mallard.performQuack();
		mallard.performFly();
		
		/*
                 动态设定行为,经过在Duck中增长两个set方法
                 在运行时想改变鸭子的行为,只需调用鸭子的setter方法就能够
                */
		Duck model = new ModelDuck();
		model.performFly();
		model.setFlyBehavior(new FlyRocketPowered());
		model.performFly();
		
	}
}
相关文章
相关标签/搜索