最近在學設計模式,這些博客權當筆記。
Strategy Pattern 策略模式
策略模式簡介:定義了算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨立於使用算法的客戶。
針對這種情況可以將父類的fly和quack方法設置成抽象方法,讓子類具體實現,這種方式有弊端,那就是如果有大量不同的子類就會造成在子類中fly和quack方法裏代碼的重複。
還有一種方法就是父類的fly和quack方法實現大多數鴨子的fly和quack功能,少數的鴨子子類只需要覆蓋這兩個方法即可,但是鬼知道大多數鴨子的fly和quack功能是什麼樣的、少數鴨子的fly和quack功能又是什麼樣的,並且在這個需求一直改變的現況下,用這兩種方式會經常去改原有的代碼。
<span style="font-size:18px;">package wang.behavior;
public interface FlyBehavior {
void fly();
}</span>
<span style="font-size:18px;">package wang.behavior;
public interface QuackBehavior {
<span style="white-space:pre"> </span>void quack();
}
</span>
package wang.oldservice;
/**
* @author Wang
*/
public abstract class Duck {
//抽象方法,讓子類去實現自己要展示的是什麼
public abstract void display();
/**
* 所有的鴨子子類都會繼承該方法,都有飛的功能
*/
public void fly(){
System.out.println("I am Flying~");
}
/**
* 所有的鴨子子類都會繼承該方法,都有呱呱叫的功能
*/
public void quack(){
System.out.println("呱呱呱~~");
}
}
package wang.behavior.impl;
import wang.behavior.FlyBehavior;
public class FlyWithWings implements FlyBehavior {
@Override
public void fly() {
System.out.println("我用翅膀飛....");
}
}
<pre name="code" class="java">不會飛的行爲:
package wang.behavior.impl;
import wang.behavior.FlyBehavior;
public class CannotFly implements FlyBehavior {
@Override
public void fly() {
System.out.println("我不會飛...");
}
}
用火箭飛行的唐老鴨:
package wang.behavior.impl;
import wang.behavior.FlyBehavior;
public class FlyWithRocket implements FlyBehavior {
@Override
public void fly() {
System.out.println("我用火箭筒飛...");
}
}
呱呱叫的行爲:package wang.behavior.impl;
import wang.behavior.QuackBehavior;
public class GuaGuaQuack implements QuackBehavior {
@Override
public void quack() {
System.out.println("呱呱 呱呱...");
}
}
吱吱叫的行爲:package wang.behavior.impl;
import wang.behavior.QuackBehavior;
public class ZhiZhiQuack implements QuackBehavior {
@Override
public void quack() {
System.out.println("吱吱 吱吱...");
}
}
不會叫的行爲:package wang.behavior.impl;
import wang.behavior.QuackBehavior;
public class CannotQuack implements QuackBehavior {
@Override
public void quack() {
System.out.println("<<我不會叫>>");
}
}
接下來就是要實現具體的鴨子子類了package wang.service;
import wang.behavior.impl.FlyWithWings;
import wang.behavior.impl.GuaGuaQuack;
public class RealDuck extends Duck {
public RealDuck() {
flyBehavior = new FlyWithWings();
quackBehavior = new GuaGuaQuack();
}
@Override
public void display() {
System.out.println("我是一個真鴨子");
}
}
橡皮鴨子,會吱吱叫,但是不會飛:package wang.service;
import wang.behavior.impl.CannotFly;
import wang.behavior.impl.ZhiZhiQuack;
public class XiangpiDuck extends Duck {
public XiangpiDuck() {
flyBehavior = new CannotFly();
quackBehavior = new ZhiZhiQuack();
}
@Override
public void display() {
System.out.println("我是一個橡皮鴨子...");
}
}
木頭鴨子,不會飛,也不會叫:
package wang.service;
import wang.behavior.impl.CannotFly;
import wang.behavior.impl.CannotQuack;
public class WoodenDuck extends Duck {
public WoodenDuck() {
flyBehavior = new CannotFly();
quackBehavior = new CannotQuack();
}
@Override
public void display() {
System.out.println("我是一個木頭鴨子");
}
}
會用火箭飛的唐老鴨,也會呱呱叫:package wang.service;
import wang.behavior.impl.FlyWithRocket;
import wang.behavior.impl.GuaGuaQuack;
public class DuckFlyWithRocket extends Duck {
public DuckFlyWithRocket() {
flyBehavior = new FlyWithRocket();
quackBehavior = new GuaGuaQuack();
}
@Override
public void display() {
System.out.println("我會用火箭飛...");
}
}
這樣我們就可以讓所有的鴨子子類任意組合fly和quack行爲,因爲fly和quack行爲是獨立的,誰都可以任意拿來用,只要遵循委託的規則。
package wang.behavior.test;
import wang.service.Duck;
import wang.service.DuckFlyWithRocket;
import wang.service.RealDuck;
import wang.service.WoodenDuck;
import wang.service.XiangpiDuck;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
Duck duck1 = new RealDuck();
duck1.display();
duck1.fly();
duck1.quack();
System.out.println("----------------------------");
Duck duck2 = new XiangpiDuck();
duck2.display();
duck2.fly();
duck2.quack();
System.out.println("----------------------------");
Duck duck3 = new WoodenDuck();
duck3.display();
duck3.fly();
duck3.quack();
System.out.println("----------------------------");
Duck duck4 = new DuckFlyWithRocket();
duck4.display();
duck4.fly();
duck4.quack();
}
}
輸出結果爲:我用翅膀飛....
呱呱 呱呱...
----------------------------
我是一個橡皮鴨子...
我不會飛...
吱吱 吱吱...
----------------------------
我是一個木頭鴨子
我不會飛...
<<我不會叫>>
----------------------------
我會用火箭飛...
我用火箭筒飛...
呱呱 呱呱...