Java 設計模式--策略模式
策略模式的設計原則:將一個類中經常改變或者可能要改變的部分提取出來作為一個介面,然後在類中宣告這個介面的例項,宣告方法可以改變這個例項,這樣類就可以呼叫實現這個介面類的方法。
就以書中例子說明:
我們有父類鴨子(Duck),鴨子有很多,如正常的鴨子,橡皮鴨子,鴨子共同點:身體兩隻腿,顏色,行為(飛,叫),因為有些鴨子是會飛的,有些不會飛,有些會呱呱叫,有些會吱吱叫,那麼鴨子的行為就是變化的,因此我們抽取這些變化的部分作為介面。
飛行介面:
public interface IFly {
public void fly();
}
叫介面:
public interface IQuack {
public void quack();
}
父類Duck:
public abstract class Duck {
private IFly mIFly;
private IQuack mIQuack;
public void setmIFly(IFly iFly)
{
mIFly=iFly;
}
public void setmIQuack(IQuack iQuack)
{
mIQuack=iQuack;
}
public void exectFly()
{
if(mIFly!=null)
mIFly.fly();
}
public void exectQuack()
{
if(mIQuack!=null)
mIQuack.quack();
}
public void body()
{
System.out.println("I have a body and two legs!");
}
public abstract void dispaly();
}
子類RedDuck:
public class RedDuak extends Duck {
@Override
public void dispaly() {
System.out.println("I am red duck!");
}
}
public class EraserDuck extends Duck {
@Override
public void dispaly() {
System.out.println("I am yello duck!");
}
}
fly行為類:
public class FlyByWings implements IFly {
@Override
public void fly() {
System.out.println("fly by wings!");
}
}
呱呱叫行為類:
public class GuaGua implements IQuack {
@Override
public void quack() {
System.out.println("gua gua jiao!");
}
}
吱吱叫行為類:
public class ZhiZhi implements IQuack {
@Override
public void quack() {
System.out.println("zhi zhi jiao!");
}
}
測試一下:
public static void main(String args[])
{
Duck readDuck =new ReadDuck();
readDuck.body();
readDuck.setmIFly(new FlyByWings ());
readDuck.setmIQuack(new GuaGua());
readDuck.exectQuack();
readDuck.exectFly();
Duck eraserDuck=new EraserDuck();
eraserDuck .body();
eraserDuck.setQuack(new ZhiZhi());
eraserDuck.exectQuack();
}
這樣我們可以動態的改變各種鴨子的行為,例如我們的RedDuck又會嘰嘰叫,這也說不準,那麼我們可以建立JiJi類實現IQuack
JiJi類實現quack方法,把這JiJi類傳給RedDuck例項,RedDuck就可以呼叫JiJi實現的quack()方法實現嘰嘰叫了。