圖一:
?圖二:
?
?? 鴨子對象,會游泳、會叫、會飛(變天鵝之后),但不是所有的鴨子都能飛(當(dāng)它還是丑小鴨的時候),初步設(shè)計如圖一。
?
? 這并不是一個復(fù)用性好的設(shè)計,有更好的解決方案(圖二)。
?
? 原則是:
?
? 1.找出應(yīng)用中可能需要變化的地方,把它們獨立出來,不要和那些不需要變化的代碼混在一起;
?
??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();
}
/**
* 飛行行為的具體實現(xiàn)
* @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();
}
}
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

