圖一:
?圖二:
?
?? 鴨子對象,會游泳、會叫、會飛(變天鵝之后),但不是所有的鴨子都能飛(當它還是丑小鴨的時候),初步設計如圖一。
?
? 這并不是一個復用性好的設計,有更好的解決方案(圖二)。
?
? 原則是:
?
? 1.找出應用中可能需要變化的地方,把它們獨立出來,不要和那些不需要變化的代碼混在一起;
?
??2.針對接口編程;
?
? 3.多用組合少用繼承;
?
? 圖二就是最簡單的策略模式(Strategy Pattern):
?
? 定義了算法族,分別封裝起來,讓它們之間可以相互替換,此模式讓算法的變化獨立于使用算法的客戶。
?
/** * 抽象鴨子父類 * @author Administrator * */ public abstract class Duck { FlyBehavior flyBehavior; QuackBehavior quackBehavior; public Duck(){} public abstract void display(); public void perfectFly(){ flyBehavior.fly(); } public void perfectQuack(){ quackBehavior.quack(); } public void swim(){ System.out.println("swimming!! now!!!"); } public void setFlyBehavior(FlyBehavior fly){ this.flyBehavior = fly; } public void setQuackBehavior(QuackBehavior quack){ this.quackBehavior = quack; } }
/** * 飛行行為接口 * @author wengn * */ public interface FlyBehavior { //飛行方法 public void fly(); }
/** * 飛行行為的具體實現 * @author wengn * */ public class FlyWithWings implements FlyBehavior { public void fly() { System.out.println("I can fly with wing!!!"); } }
/** * 子類鴨子 * @author wengn * */ public class MallardDuck extends Duck { public MallardDuck(){ } @Override public void display() { System.out.println("I am a real Mallard duck!!"); } }
/** * 測試類 * @author wengn * */ public class Test { public static void main(String[] args) { Duck mallard = new MallardDuck(); mallard.setFlyBehavior(new FlyWithWings()); mallard.perfectFly(); } }
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
