- 意義:分別封裝行為接口,實(shí)現(xiàn)算法組集歇,超類里放行為接口對(duì)象揩悄,在子類里具體設(shè)定行為對(duì)象。原則就是:分離變化部分鬼悠,封裝接口删性,基于接口編程各種功能。此模式讓行為算法的變化獨(dú)立與算法的使用者焕窝。
-
UML:
image.png - 環(huán)境(Context)角色:持有一個(gè)Strategy的引用蹬挺。
- 抽象策略(Strategy)角色:這是一個(gè)抽象角色,通常由一個(gè)-
接口或抽象類實(shí)現(xiàn)它掂。此角色給出所有的具體策略類所需的接口巴帮。 - 具體策略(ConcreteStrategy)角色:包裝了相關(guān)的算法或行為。
- 設(shè)計(jì)模型:鴨子
- 特點(diǎn): 鴨子有的會(huì)飛虐秋,有的不會(huì)飛榕茧。有的會(huì)叫,有的不會(huì)叫客给。但都會(huì)游泳
鴨子基類設(shè)計(jì):
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 SetQuackBehavoir(QuackBehavior qb) {
mQuackBehavior = qb;
}
public void SetFlyBehavoir(FlyBehavior fb) {
mFlyBehavior = fb;
}
public void swim() {
System.out.println("~~im swim~~");
}
}
行為組設(shè)計(jì):
//飛行接口
public interface FlyBehavior {
void fly();
}
//壞的飛行
public class BadFlyBehavior implements FlyBehavior{
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("--BadFly--");
}
}
//好的飛行
public class GoodFlyBehavior implements FlyBehavior{
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("--GoodFly--");
}
}
//不會(huì)飛
public class NoFlyBehavior implements FlyBehavior{
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("--NoFly--");
}
}
叫聲行為組設(shè)計(jì):
//叫聲接口
public interface QuackBehavior {
void quack();
}
//嘎嘎叫
public class GaGaQuackBehavior implements QuackBehavior{
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("__GaGa__");
}
}
//咯咯叫
public class GeGeQuackBehavior implements QuackBehavior{
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("__GeGe__");
}
}
//不會(huì)叫
public class NoQuackBehavior implements QuackBehavior{
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("__NoQuack__");
}
}
實(shí)現(xiàn)了不同行為策略的鴨子
//綠頭鴨會(huì)飛用押,還會(huì)嘎嘎叫
public class GreenHeadDuck extends Duck {
public GreenHeadDuck() {
mFlyBehavior = new GoodFlyBehavior();
mQuackBehavior = new GaGaQuackBehavior();
}
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println("**GreenHead**");
}
}
//紅頭鴨子不會(huì)飛,但是會(huì)咯咯叫
public class RedHeadDuck extends Duck {
public RedHeadDuck() {
mFlyBehavior = new BadFlyBehavior();
mQuackBehavior = new GeGeQuackBehavior();
}
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println("**RedHead**");
}
}
有了這些行為組之后靶剑,我們?cè)诙x具體的鴨子時(shí)蜻拨,只需要組合不同的具體行為,父類就能幫我們調(diào)用具體的行為桩引。這樣的好處缎讼,子類能充分復(fù)用共同的行為代碼,并且能夠隨意組合各種行為坑匠,還將變化的行為分離出來(lái)血崭,對(duì)行為的擴(kuò)展是開(kāi)發(fā)的。