(一)策略模式
策略模式定義了算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨立于使用算法的客戶。
設計原則:1、找出應用中可能需要變化之處,把他們獨立出來,不要和那些不需要變化的代碼混在一起。(把變化的飛行行為、呱呱叫行為從不變的鴨子類中取出來)
2、針對接口編程,而不是針對實現編程。(FlyBehavior、QuackBehavior)
? ?3、多用組合,少用繼承。(有一個比是一個更好)
Talk is cheap,
Duck類:
public abstract class Duck {/** 行為接口* */FlyBehavior flyBehavior;QuackBehavior quackBehavior;public Duck(){}public abstract void dispaly();/** 設定鴨子的行為* */public void setFlyBehavior(FlyBehavior fb){flyBehavior = fb;}public void setQuackBehavior(QuackBehavior qb){quackBehavior = qb;}/** 委托給行為類* */public void performFly(){flyBehavior.fly();}public void performQuack(){quackBehavior.quack();}public void swim(){System.out.println("All dusks float,even decoys");}}Fly接口、Quack接口:
/* * 飛行接口 * */ public interface FlyBehavior {public void fly(); }public interface QuackBehavior {public void quack(); }實現:
/* * 不會飛的鴨子的行為 * */ public class FlyNoWay implements FlyBehavior{@Overridepublic void fly() {System.out.println("i cant fly!!");} }public class FlyRocketPowered implements FlyBehavior{@Overridepublic void fly() {System.out.println("i'm flying with a rocket!");} }/* *真會飛的鴨子的行為 * */ public class FlyWithWings implements FlyBehavior{@Overridepublic void fly() {System.out.println("i'm flying !!");} } public class MuteQuack implements QuackBehavior{@Overridepublic void quack() {System.out.println("<Since>");} }public class Quack implements QuackBehavior{@Overridepublic void quack() {System.out.println("Quack");} }public class Squeak implements QuackBehavior{@Overridepublic void quack() {System.out.println("Sqeak");} }子類:
public class MallardDuck extends Duck{public MallardDuck(){quackBehavior = new Quack();flyBehavior = new FlyWithWings();}@Overridepublic void dispaly() {System.out.println("i'm a real Mallard duck!");} }public class ModelDuck extends Duck{public ModelDuck(){flyBehavior = new FlyNoWay();quackBehavior = new MuteQuack();}@Overridepublic void dispaly() {System.out.println("i'm a model duck!");}}?
測試:
public class MiniDuckSimulator {public static void main(String[] args){Duck mallard = new MallardDuck();mallard.performFly();//調用MallardDuck繼承的performFly()方法,進而委托給該對象的FlyBehaviour處理 mallard.performQuack();Duck model1 = new ModelDuck();model1.performFly();model1.setFlyBehavior(new FlyRocketPowered());//動態的改變飛行行為 model1.performFly();} }?
轉載于:https://www.cnblogs.com/tshua/p/5575786.html
總結
- 上一篇: Linux下的inode记录
- 下一篇: jquery中跳出each循环