1. 程式人生 > >設計模式真香筆記-策略模式

設計模式真香筆記-策略模式

策略模式的定義

定義了一系列演算法,分別封裝起來,讓它們之間可以互相替換,讓演算法的變化獨立於使用他們的客戶

利用到的設計模式原則

  • 找出應用中可能需要變化之處,把他們獨立出來,不要和那些不需要變化的程式碼混在一起
  • 針對介面程式設計,而不是針對實現程式設計
  • 多用組合少用繼承

UML類圖
鴨子論
實現程式碼

  • Duck.java (鴨子抽象類)
package duck;

/**
 * 鴨子論之實現
 *
 * @author hjsjy
 * @create 2018/10/9
 * @since 1.0.0
 */
public abstract
class Duck { Flybehavior flybehavior; Quackbehavior quackbehavior; public void setQuackbehavior(Quackbehavior quackbehavior) { this.quackbehavior = quackbehavior; } public void setFlybehavior(Flybehavior flybehavior) { this.flybehavior = flybehavior; } public
void PeformFly(){ flybehavior.fly(); } public void PerformQuack(){ quackbehavior.quack(); } public void swim(){ System.out.println("我可以游泳!"); } public abstract void display(); }
  • Flybehavior.java (飛行行為介面)
public interface Flybehavior {
    void
fly(); }
  • 飛行行為介面實現
public class FlyNoWay implements Flybehavior {

    @Override
    public void fly() {
        System.out.println("不能飛!!!!!!");
    }
}
  • 飛行行為介面實現
 */
public class FlyOnSky implements Flybehavior {

    @Override
    public void fly() {
        System.out.println("在天上飛!!!!!!!");
    }
}
  • Quackbehavior.java (鴨叫行為介面)
public interface Quackbehavior {
     void quack();
}

  • AQuack.java(鴨叫行為實現)
public class AQuack implements Quackbehavior {

    @Override
    public void quack() {
        System.out.println("嘎嘎嘎!!!!!!!!!");
    }
}
  • NoQuack(鴨叫行為實現)
public class NoQuack implements Quackbehavior {

    @Override
    public void quack() {
        System.out.println("沒有聲音!!!!!!!!");
    }
}
  • HjsjyDuck.java(實現鴨子抽象類)
public class HjsjyDuck extends  Duck {
    public HjsjyDuck(){
        flybehavior=new FlyOnSky();
        quackbehavior=new AQuack();
    }
    @Override
    public void display() {
        System.out.println("我是一直會游泳,會飛並且會嘎嘎嘎的鴨子!!!!!!!!!");
    }
}
  • DuckTest.java(鴨子測試類)
public class DuckTest {
    public static void main(String[] args) {
        Duck hjsjyDuck = new HjsjyDuck();
        hjsjyDuck.display();
        hjsjyDuck.swim();
        hjsjyDuck.PeformFly();
        hjsjyDuck.PerformQuack();
        hjsjyDuck.setFlybehavior(new FlyNoWay());
        hjsjyDuck.PeformFly();
    }
}

輸出結果
輸出結果


本文參考 :《Head First 設計模式》