行为型-策略模式

package strategy;
/**
 * @author jiq
 * 类型:Behavioral
 * 模拟各种鸭子,会有用,呱呱叫,有的会飞,有的不会等...
 * 继承并不总是好的选择。
 * **************************************************
 * 策略模式定义:
 * 	定义一个算法簇,分别封装起来,让他们之间可以相互替换,
 * 	此模式让算法的变化独立于使用算法的客户。
 * **************************************************
 * 遵守的OO设计原则:
 * 	Change:不管设计的多好,软件总会演化。
 * (1)原则1:找出可能需要变化的部分,把他们与那些固定不变的部分分离开来;
 * 		假设鸭子可能的行为有游泳,叫,飞,以及显示自己的描述,并且所有鸭子都一定会
 * 		游泳,显示自己的描述,但是有的鸭子可能不会飞,比如橡皮鸭,或者有的不i会叫,
 * 		或者叫的方式不一样等等,这些属于变化的部分。
 * (2)原则2:针对接口编程,而不是针对实现编程。
 * (3)原则3:多用组合,少用继承。
 * 		各种变化的行为FlyBehavior和QuackBehavior等组合到具体的鸭子类中,
 * 		可以在运行时动态改变鸭子的各种行为的同时,方便鸭子进行拓展。
 * ********************************************************************
 * 		这些动态变化的部分(FlyBehavior和QuackBehavior等)组合到鸭子类中,
 * 		可以吧这样的“一组行为”想象成“一簇算法”,这就是策略模式名称的由来。
 * ********************************************************************
 */
/**
 * 鸭子类固定的部分
 * */
abstract class Duck{
	/**
	 * 算法簇(组合)/一组行为
	 * */
	FlyBehavior flyBehavior;
	QuackBehavior quackBehavior;
	
	public abstract void display();
	
	public void swim(){
		System.out.println("All duck can swim!");
	}
	
	/**
	 * 提供动态改变鸭子行为的接口
	 * */
	public void setFlyBehavior(FlyBehavior f){
		this.flyBehavior = f;
	}
	
	public void setQuackBehavior(QuackBehavior q){
		this.quackBehavior = q;
	}
	
	/**
	 * 变化的部分委托给行为类
	 * */
	public void performFly(){
		flyBehavior.fly();
	}
	
	public void performQuack(){
		quackBehavior.quack();
	}
}

/**
 * 变化的部分(算法簇)
 * */
interface FlyBehavior{
	public void fly();
}

interface QuackBehavior{
	public void quack();
}
//////////////////////////////////////////////////
/*
 * 各种鸭子
 * */
class BeiJingDuck extends Duck{
	public void display() {
		System.out.print("I am a delicious Duck\n");		
	}
}

class NanJingDuck extends Duck{
	public void display() {
		System.out.print("I am a inteligent Duck\n");		
	}	
}
/*
 * 各种行为
 * */
class FlyWithWings implements FlyBehavior{
	public void fly() {
		System.out.println("i fly so Slow");
	}
}

class FlyRocketPowered implements FlyBehavior{
	public void fly() {
		System.out.println("i can fly faster than rocket");
	}	
}

class FemaleQuack implements QuackBehavior{
	public void quack() {
		System.out.println("i can quack, but not loud");
	}	
}
/**
 * 运行时动态改变鸭子行为
 * 这些鸭子都是很容易拓展的
 * 可以加入各种各样的不同的一组行为(算法簇)而不影响现有的东东
 * 各种具体的行为(飞行)可以被替换成不同的具体行为(飞行)。
 * */
public class DuckSimulator {
	public static void main(String[] args) {
		NanJingDuck nd = new NanJingDuck();

		/* 创建一支南京鸭,只能慢慢飞,像母鸭子那么叫 */
		nd.setFlyBehavior(new FlyWithWings());
		nd.setQuackBehavior(new FemaleQuack());
		nd.display();
		nd.performFly();
		nd.performQuack();
		
		/* 突然有一天看到一支很帅很帅的鸭子,然后交配 */
		//... do something you should not to see
		
		/* 突然就变得可以像火箭那么牛逼滴飞了 */
		nd.setFlyBehavior(new FlyRocketPowered());
		nd.performFly();
		nd.performQuack();
	}
}

你可能感兴趣的:(策略模式)