策略模式:分別封裝行爲(算法)接口,超類裏放行爲(算法)接口,在子類裏賦值具體行爲(算法)對象。
原則:分離變化部分,封裝接口,基於接口編程各種行爲(算法)功能。
作用:此方法讓行爲(算法)的變化獨立於行爲(算法)的使用者。
文章目錄
一 模擬鴨子的遊戲
1、鴨子的抽象類
實現
public abstract class Duck {
public Duck() {
}
public void Quack() {
System.out.println("~~gaga~~");
}
public abstract void display();
public void swim() {
System.out.println("~~im swim~~");
}
public void Fly() {
System.out.println("~~im fly~~");
}
}
2、鴨子的具體實現類
1)、GreenHeadDuck
public class GreenHeadDuck extends Duck {
@Override
public void display() {
System.out.println("**GreenHead**");
}
public void Fly() {
System.out.println("~~no fly~~");
}
}
2)、RedHeadDuck
public class RedHeadDuck extends Duck {
@Override
public void display() {
System.out.println("**RedHead**");
}
// public void Fly() {
// System.out.println("~~good fly~~");
// }
}
3)、StoneDuck
public class StoneDuck extends Duck {
@Override
public void display() {
System.out.println("**StoneDuck**");
}
public void Quack() {
System.out.println("~~no gaga~~");
}
public void swim() {
System.out.println("~~no swim~~");
}
public void Fly() {
System.out.println("~~no fly~~");
}
}
3、以上遇到的問題、
當我們要擴展一個行爲的時候,例如fly,
1、使用繼承的時候,fly()的實現放在超類,優點是代碼的複用,缺點是有功能溢出;
2、不使用繼承的時候,fly()在各個子類中實現,缺點是代碼複用性不好;
爲解決以上兩點,就用行爲的組合,不用行爲的繼承;既滿足代碼複用,也滿足不功能溢出。
二、分析問題的方法論
1)、分析問題的變化部分和不變部分,提取變化部分,抽象成接口+實現;
2)、鴨子哪些功能是會根據新需求變化的?叫聲/飛行。。。
例如:
1、接口:
1)、飛行的接口:
public interface FlyBehavior{
void fly();
}
2)、叫聲的接口
public interface QuackBehavior {
void quack();
}
3)好處:新增行爲簡單,行爲類更好的複用,組合更方便。既有繼承帶來的複用好處,沒有挖坑
三、策略模式的實現
1、增加行爲接口的抽象Duck
public abstract class Duck {
FlyBehavior mFlyBehavior;
QuackBehavior mQuackBehavior;
public Duck() {}
public void Fly() {
mFlyBehavior.fly();
}
public void Quack() {
mQuackBehavior.quack();
}
public abstract void display();
public void swim() {
System.out.println("~~im swim~~");
}
2、行爲接口及具體實現
1)、行爲接口
public interface FlyBehavior {
void fly();`在這裏插入代碼片`
}
2)、BadFlyBehavior具體行爲
public class BadFlyBehavior implements FlyBehavior
{
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("--BadFly--");
}
}
3)、GoodFlyBehavior具體行爲
public class GoodFlyBehavior implements FlyBehavior
{
@Override
public void fly() {
System.out.println("--GoodFly--");
}
}
4)、NoFlyBehavior具體行爲
public class NoFlyBehavior implements FlyBehavior
{
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("--NoFly--");
}
}
3、具體實現的GreenHeadDuck
public class GreenHeadDuck extends Duck {
public GreenHeadDuck() {
mFlyBehavior = new GoodFlyBehavior();
mQuackBehavior = new GaGaQuackBehavior();
}
@Override
public void display() {
System.out.println("**GreenHead**");
}
}