天天看點

政策模式

   【政策模式應用場景舉例】

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

    【政策模式解釋】

    類型:行為模式

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

    【政策模式UML圖】

    【政策模式-JAVA代碼實作】

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

    建立一個輪胎接口:

package strategy_interface;

public interface tyre_interface {

    // tyre 輪胎

    public void print_tyre_line();// 顯示出輪胎的痕迹

}

    建立2個輪胎接口的實作類:

  基于一個輪胎接口來實作不同樣式的輪胎樣式。

    組裝一個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類的前題下進行了不同輪胎樣式的改變,輪胎和輪胎之間可以互相替換,這就是政策模式。

package strategy_implement;

//長痕迹輪胎類

public class tyre_long_implement implements tyre_interface {

    public void print_tyre_line() {

        System.out.println("在路面上顯示一個長輪胎痕迹");

//短痕迹輪胎類

public class tyre_short_implement implements tyre_interface {

        System.out.println("在路面上顯示一個短輪胎痕迹");