設計模式3 State設計模式

2021-06-23 01:59:03 字數 3313 閱讀 3426

state狀態設計模式類似於switch多路分支功能的開關,state狀態模式機制如下:

狀態模式uml圖如下:

state狀態設計模式用於改變物件的行為,在**的生命週期裡,隨著狀態變化從乙個目標實現程式切換到另乙個目標實現程式。

我們經常遇到如下的程式**:

public class creature else{

system.out.println("darling!");

//轉換標識

public void kiss(){

isfrog = false;

public static void main(string args){

creature creature = new creature();

creature.greet();

creature.kiss();

creature.greet();

上面例子**中greet()方法在執行具體操作之前必須要判斷一下標識,**顯得笨拙繁瑣,使用簡單state狀態模式改寫上面**如下:

public class creature{

//狀態介面

private inte***ce state{

string response();

private class forg implements state{

public string response(){

return "ribbet!";

private class prince implements state{

public string response(){

return "darling!");

private state state = new forg();

public void greet(){

system.out.println(state.response);

public void kiss() {

state = new prince();

public static void main(string args){

creature creature = new creature();

creature.greet();

creature.kiss();

creature.greet();

state狀態設計模式中,狀態自動切換並傳播,不需要再改動標識,**顯得非常優雅。

state狀態設計模式乙個基本框架如下:

//狀態介面

inte***ce state{

void operation1();

void operation2();

void operation3();

//狀態實現類1

class implementation1 implements state{

public void operation1(){

system.out.println("imlementation1.operation1()");

public void operation2(){

system.out.println("implementation1.operation2()");

public void operation3(){

system.out.println("implementation1.operation3()");

//狀態實現類2

class implementation2 implements state{

public void operation1(){

system.out.println("implementation2.operation1()");

public void operation2(){

system.out.println("implementation2.operation2()");

public void operation3(){

system.out.println("implementation2.operation3()");

//服務提供者

class serviceprovider{

private state state;

public serviceprovider(state state){

this.sate = state;

//狀態更改

public void changestate(state newstate){

state = newstate;

public void service1(){

state.operation1();

state.operation3();

public void service2(){

state.operation1();

state.operation2();

publc void service3(){

state.operation3();

state.operation2();

public class statedemo{

private serviceprovider sp = new serviceprovider(new implementation1());

private void run(serviceprovider sp){

sp.service1();

sp.service2();

sp.service3();

public static void main(string args){

statedemo demo = new statedemo();

demo.run(sp);

sp.changestate(new implementation2());

demo.run(sp);

state狀態模式和proxy**模式都為客戶端提供了乙個目標程式**,真正的目標程式被**所隱藏,當客戶端程式呼叫目標程式時,首先將呼叫請求傳送給**,**才真正呼叫目標程式,但是proxy**模式和state狀態模式有如下區別:

(1)proxy**模式中被呼叫的目標程式只有乙個,而state狀態模式中被呼叫的目標程式有多個。

(2)proxy**模式的目的是控制客戶端對目標程式的訪問,而state狀態模式是為了根據條件動態改變目標程式。

設計模式3 State設計模式

state狀態設計模式類似於switch多路分支功能的開關,state狀態模式機制如下 狀態模式 uml圖如下 state狀態設計模式用於改變物件的行為,在 的生命週期裡,隨著狀態變化從乙個目標實現程式切換到另乙個目標實現程式。我們經常遇到如下的程式 public class creatureels...

設計模式 3 狀態設計模式State

狀態模式用來改變物件的行為,當狀態發生變化時,行為也隨著發生變化,和switch分支語句有點類似,比如如下的 public class creatureelse 轉換標識 public void kiss public static void main string args greet 方法在業務...

State設計模式

最近做實驗時用到了state設計模式,雖然老師說state設計模式要到以後講,但通過自學我已經基本明白其要點,不妨在此寫一些東西。我們知道,軟體在執行過程中,會產生很多的狀態,狀態就是指軟體所處的某一種相對穩定的形式,在這裡我要解釋清楚它和軟體基線的區別。軟體的基線是指軟體本身所處的相對穩定的形式,...