Posted on 2009-01-20 17:27
非洲小白臉 閱讀(212)
評(píng)論(0) 編輯 收藏 所屬分類:
模式
設(shè)計(jì)模式-快餐簡(jiǎn)解-【策略模式】
【
策略模式應(yīng)用場(chǎng)景舉例】
比如在玩“極品飛車”這款游戲,那么游戲?qū)嚨妮喬ナ强梢愿鼡Q的,不同的輪胎在高速轉(zhuǎn)彎時(shí)有不同的痕跡樣式,那么針對(duì)“汽車”的配件“輪胎”就要可以變化,而且輪胎和輪胎之間是可以相互替換的,這就是典型的要應(yīng)用“策略模式”的場(chǎng)景!
【
策略模式解釋】
類型:行為模式
定義一組算法,將每個(gè)算法都封裝起來(lái),并且使它們之間可以互換。策略模式使這些算法在客戶端調(diào)用它們的時(shí)候能夠互不影響地變化。
【
策略模式UML圖】

【
策略模式-JAVA代碼實(shí)現(xiàn)】
從策略模式UML圖中可以看到Context與接口Strategy是組合關(guān)系,即強(qiáng)引用關(guān)系。
新建一個(gè)輪胎接口:
package strategy_interface;
public interface tyre_interface {
// tyre 輪胎
public void print_tyre_line();// 顯示出輪胎的痕跡
}
新建2個(gè)輪胎接口的實(shí)現(xiàn)類:
package strategy_implement;
import strategy_interface.tyre_interface;
//長(zhǎng)痕跡輪胎類
public class tyre_long_implement implements tyre_interface {
public void print_tyre_line() {
System.out.println("在路面上顯示一個(gè)長(zhǎng)輪胎痕跡");
}
}
package strategy_implement;
import strategy_interface.tyre_interface;
//短痕跡輪胎類
public class tyre_short_implement implements tyre_interface {
public void print_tyre_line() {
System.out.println("在路面上顯示一個(gè)短輪胎痕跡");
}
}
基于一個(gè)輪胎接口來(lái)實(shí)現(xiàn)不同樣式的輪胎樣式。
組裝一個(gè)Car車類:
package car_package;
import strategy_interface.tyre_interface;
public class Car {
private String make_address;// 制造地
private int death_year;// 報(bào)廢年限
private int speed;// 速度
private tyre_interface tyre_interface_ref;// 輪胎的樣式
public String getMake_address() {
return make_address;
}
public void setMake_address(String make_address) {
this.make_address = make_address;
}
public int getDeath_year() {
return death_year;
}
public void setDeath_year(int death_year) {
this.death_year = death_year;
}
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
public tyre_interface getTyre_interface_ref() {
return tyre_interface_ref;
}
public void setTyre_interface_ref(tyre_interface tyre_interface_ref) {
this.tyre_interface_ref = tyre_interface_ref;
}
public void start() {
System.out.println("車的基本信息為:");
System.out.println("制造地make_address:" + this.getMake_address());
System.out.println("報(bào)廢年限death_year:" + this.getDeath_year());
System.out.println("速度speed:" + this.getSpeed());
System.out.println("Car 起動(dòng)了!");
System.out.println("Car高速行駛,遇到一個(gè)大轉(zhuǎn)彎,路面顯示:");
this.getTyre_interface_ref().print_tyre_line();
}
}
讓車跑起來(lái),并且具有更換輪胎樣式的功能:
package main_run;
import strategy_implement.tyre_long_implement;
import strategy_implement.tyre_short_implement;
import car_package.Car;
public class run_main {
public static void main(String[] args) {
tyre_long_implement tyre_long_implement = new tyre_long_implement();
tyre_short_implement tyre_short_implement = new tyre_short_implement();
Car car = new Car();
car.setDeath_year(8);
car.setMake_address("北京朝陽(yáng)區(qū)");
car.setSpeed(200);
car.setTyre_interface_ref(tyre_long_implement);
car.start();
}
}
控制臺(tái)打印出:
車的基本信息為:
制造地make_address:北京朝陽(yáng)區(qū)
報(bào)廢年限death_year:8
速度speed:200
Car 起動(dòng)了!
Car高速行駛,遇到一個(gè)大轉(zhuǎn)彎,路面顯示:
在路面上顯示一個(gè)長(zhǎng)輪胎痕跡
是一個(gè)長(zhǎng)輪胎痕跡,但在程序中可以使用代碼:car.setTyre_interface_ref(tyre_long_implement);來(lái)對(duì)
輪胎的樣式進(jìn)行不同的替換,可以替換成短輪胎痕跡的汽車輪胎,這樣在不更改Car類的前題下進(jìn)行了不同輪胎樣式的改變,輪胎和輪胎之間可以互相替換,這就
是策略模式。