設計模式一:策略模式

定義:策略模式定義了算法族(每一個行爲的實現都是算法,合起來就是算法族),分別封裝起來,讓它們之間能夠互相替換,此模式讓算法的變化獨立於使用算法的客戶。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();
		
	}
}
相關文章
相關標籤/搜索