设计模式之一
設計模式設計出來就是為了讓后期維護代碼更容易,增加代碼的強壯性等好處!
策略模式
? 自己的理解:定義一個算法族,分別分裝起來,使他們能互相替換且算法的變換與使用算法的對象相互獨立。簡單來說是將變化的和不變得分離,對接口編程,不對實現編程(少用繼承)。
?
下面舉個例子:
Joe上班的公司做了一套相當成功的模擬鴨子游戲:SirmDuck。游戲中出現各種鴨子,一遍游泳,一遍呱呱叫。此系統的內部設計使用了標準的OO技術。設計了一個鴨子的超類(SuperDuck)并讓各種鴨子繼承此類。一天公司要求在水里游泳的鴨子要會飛。Joe毫不猶豫的將SuperDuck中添加了fly()方法。第二天Joe被叫進辦公司問道,游戲中的橡皮鴨子在屏幕中飛來飛去。(《Head First 設計模式》里的翻版)
問題:只要繼承了這個超類,都會飛。。而且后期如果加入別的不會叫的鴨子,也要動原始代碼?
解決::利用策略模式。面向接口編程,將變的抽離出來。
以下是自己寫的代碼:
?
/*** Created by Administrator on 2018/1/12.
* 將鴨子的飛的行為分離出來 先寫這個行為,具體的怎么飛按照各鴨子的重寫
*/
public interface FlyBehavior {
void fly();
}
/**
* Created by Administrator on 2018/1/12.
* 將鴨子的叫的行為分離出來
*/
public interface MaleBehavior {
void male();
}
public class NoFly implements FlyBehavior {
@Override
public void fly() {
//不會飛
System.out.println("我不會飛!");
}
}
public class CanFly implements FlyBehavior {
@Override
public void fly() {
//能飛
System.out.println("我會飛!");
}
}
public class CanMale implements MaleBehavior {
@Override
public void male() {
System.out.println("我會叫,叫起來 吱吱吱");
}
}
public class CanMale1 implements MaleBehavior {
@Override
public void male() {
System.out.println("我會叫 叫起來像 呱呱呱");
}
}
/**
* Created by Administrator on 2018/1/12.
* 鴨子的超類,每一個鴨子都要繼承這個Duck
*/
public class Duck {
//鴨子有兩個行為 飛和叫
FlyBehavior flyBehavior;
MaleBehavior maleBehavior;
public Duck(){
}
public void flyBehavior(){
flyBehavior.fly();
}
public void maleBehavior(){
maleBehavior.male();
}
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setMaleBehavior(MaleBehavior maleBehavior) {
this.maleBehavior = maleBehavior;
}
}
public class ModulDuck extends Duck {
//可以在構造函數里去new 對應的行為。。然后在建鴨子的時候 new對應的鴨子即可
public ModulDuck(){
flyBehavior=new NoFly();
// maleBehavior=new
}
public void display(){
System.out.println("我是一只模型鴨子!");
}
}
//測試類 public class DuckTest {
public static void main(String[] args){
Duck duck=new Duck();
duck.setFlyBehavior(new CanFly());
duck.setMaleBehavior(new CanMale1());
duck.flyBehavior();
duck.maleBehavior();
Duck duck1=new Duck();
duck1.setMaleBehavior(new CanMale());
duck1.setFlyBehavior(new NoFly());
duck1.flyBehavior();
duck1.maleBehavior();
}
}
?
?
轉載于:https://www.cnblogs.com/xiaohuachen/p/8277299.html
總結
- 上一篇: 微信APP支付开发指引
- 下一篇: 初识设计模式(装饰者模式)