1.策略模式概念
策略模式(Strategy Pattern),實(shí)現(xiàn)一個(gè)類(lèi)的行為或其算法可以在運(yùn)行時(shí)更改。策略模式屬于行為型模式。
2.策略模式作用
定義一系列的算法,把它們一個(gè)個(gè)封裝起來(lái), 并且使它們可相互替換。例如,“鴨子叫”這個(gè)行為可以有多種情況。真正的鴨子是“嘎嘎叫”,橡皮鴨是“吱吱叫”,木頭鴨是不會(huì)發(fā)出聲音的。這里就可以給鴨子叫的行為定義一個(gè)interface,給“嘎嘎叫”,“吱吱叫”,不發(fā)出聲音這三種行為分別定義三個(gè)類(lèi)實(shí)現(xiàn)這個(gè)接口。
3.使用場(chǎng)景
1)如果在一個(gè)系統(tǒng)里面有許多類(lèi),它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動(dòng)態(tài)地讓一個(gè)對(duì)象在許多行為中選擇一種行為。
2)一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種。
3)如果一個(gè)對(duì)象有很多的行為,如果不用恰當(dāng)?shù)哪J?,這些行為就只好使用多重的條件選擇語(yǔ)句來(lái)實(shí)現(xiàn)。
4.優(yōu)點(diǎn)和缺點(diǎn)
優(yōu)點(diǎn):
1)算法可以自由切換。
2)避免使用多重條件判斷。
3)擴(kuò)展性良好。
缺點(diǎn):
1)策略類(lèi)會(huì)增多。
2)所有策略類(lèi)都需要對(duì)外暴露。
5.例子解析
策略接口:
public interface QuackBehavior {
public void quack();
}
策略對(duì)象一:吱吱叫行為
public class ZZQuack implements QuackBehavior {
@Override
public void quack() {
System.out.println("吱吱叫");
}
}
策略對(duì)象二:呱呱叫行為
public class GGQuack implements QuackBehavior {
@Override
public void quack() {
System.out.println("嘎嘎叫");
}
}
策略對(duì)象三:不發(fā)出聲音
public class NoQuack implements QuackBehavior {
@Override
public void quack() {
System.out.println("不發(fā)出聲音");
}
}
配置類(lèi):
public class Duck {
private QuackBehavior quackBehavior = null;
public Duck(String what) {
System.out.printf(what);
}
public void performQuack()
{
if (quackBehavior!=null) {
quackBehavior.quack();
}
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
客戶(hù)端:
public class Test {
public static void main(String[] args) {
Duck whiteDuck = new Duck("白鴨子");
whiteDuck.setQuackBehavior(new GGQuack());
whiteDuck.performQuack();
Duck rubberDuck = new Duck("橡皮鴨子");
rubberDuck.setQuackBehavior(new ZZQuack());
rubberDuck.performQuack();
Duck woodDuck = new Duck("木頭鴨子");
woodDuck.setQuackBehavior(new NoQuack());
woodDuck.performQuack();
}
}
6.總結(jié)
1)多用組合,少用繼承。其實(shí)設(shè)計(jì)模式只是提供給我們一個(gè)概念,規(guī)范代碼,便于后期維護(hù),很多時(shí)候我們要視情況而定。這里的組合又是什么意思?組合是一種“has-a”的關(guān)系。簡(jiǎn)單的說(shuō)就是一個(gè)類(lèi)里面擁有另一個(gè)類(lèi)的引用。這時(shí)候可以說(shuō)“Class A has a Class B”,如圖
該類(lèi)圖對(duì)應(yīng)的代碼如下:
public abstract class Duck {
IFlyBebavior flyBebavior;
IQuackBehavior iQuackBehavior;
public Duck() {
}
public void performFly()
{
flyBebavior.fly();
}
public void performQuack()
{
iQuackBehavior.quack();
}
public void swim()
{
System.out.println("在游泳");
}
public void display()
{
System.out.print("外觀");
}
public void setFlyBebavior(IFlyBebavior flyBebavior) {
this.flyBebavior = flyBebavior;
}
public void setiQuackBehavior(IQuackBehavior iQuackBehavior) {
this.iQuackBehavior = iQuackBehavior;
}
}
這里的"飛行為IFlyBebavior "和"叫行為IQuackBehavior "同時(shí)被這個(gè)Duck類(lèi)持有,也就是說(shuō)"Class Duck has IFlyBebavior "和"Class Duck has IQuackBehavior "都是一種組合行為。
7.源碼地址
http://download.csdn.net/detail/lgywsdy/9748210