裝飾模式

    【策略模式應用場景舉例

    比如在玩“極品飛車”這款遊戲,那麼遊戲對車的輪胎是可以更換的,不同的輪胎在高速轉彎時有不同的痕跡樣式,那麼針對“汽車”的配件“輪胎”就要可以變化,而且輪胎和輪胎之間是可以相互替換的,這就是典型的要應用“策略模式”的場景!從程序結構中可以看到,完全符合了前面我們的要求:“靈活”,“順序敏感”。

    【策略模式解釋

    類型:行爲模式

    定義一組算法,將每個算法都封裝起來,並且使它們之間可以互換。策略模式使這些算法在客戶端調用它們的時候能夠互不影響地變化。

    【策略模式UML圖

    【策略模式-JAVA代碼實現

    從策略模式UML圖中可以看到Context與接口Strategy是組合關係,即強引用關係。

    新建一個輪胎接口:

 

package strategy_interface;
public interface tyre_interface {
    
// tyre 輪胎
    public void print_tyre_line();// 顯示出輪胎的痕跡
}

 

    新建2個輪胎接口的實現類:

package strategy_implement;
import strategy_interface.tyre_interface;
//長痕跡輪胎類
public class tyre_long_implement implements tyre_interface {
    
public void print_tyre_line() {
        System.out.println(
"在路面上顯示一個長輪胎痕跡");
    }
}

 

package strategy_implement;
import strategy_interface.tyre_interface;
//短痕跡輪胎類
public class tyre_short_implement implements tyre_interface {
    
public void print_tyre_line() {
        System.out.println(
"在路面上顯示一個短輪胎痕跡");
    }
}
  基於一個輪胎接口來實現不同樣式的輪胎樣式。

    組裝一個Car車類:

package car_package;
import strategy_interface.tyre_interface;
public class Car {
    
private String make_address;// 製造地
    private int death_year;// 報廢年限
    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(
"報廢年限death_year:" + this.getDeath_year());
        System.out.println(
"速度speed:" + this.getSpeed());

        System.out.println(
"Car 起動了!");

        System.out.println(
"Car高速行駛,遇到一個大轉彎,路面顯示:");
        
this.getTyre_interface_ref().print_tyre_line();
    }
}

    讓車跑起來,並且具有更換輪胎樣式的功能:

 

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(
"北京朝陽區");
        car.setSpeed(
200);
        car.setTyre_interface_ref(tyre_long_implement);
        car.start();
    }
}

 

    控制檯打印出:

 

車的基本信息爲:
製造地make_address:北京朝陽區
報廢年限death_year:
8
速度speed:
200
Car 起動了!
Car高速行駛,遇到一個大轉彎,路面顯示:
在路面上顯示一個長輪胎痕跡

 

    是一個長輪胎痕跡,但在程序中可以使用代碼:car.setTyre_interface_ref(tyre_long_implement);來對輪胎的樣式進行不同的替換,可以替換成短輪胎痕跡的汽車輪胎,這樣在不更改Car類的前題下進行了不同輪胎樣式的改變,輪胎和輪胎之間可以互相替換,這就是策略模式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章