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();
}
}