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設計模式要到以後講,但通過自學我已經基本明白其要點,不妨在此寫一些東西。我們知道,軟體在執行過程中,會產生很多的狀態,狀態就是指軟體所處的某一種相對穩定的形式,在這裡我要解釋清楚它和軟體基線的區別。軟體的基線是指軟體本身所處的相對穩定的形式,...