java設計模式-State模式


1.背景:                    

MM的狀態是非常不固定的,說不定剛才還非常高興,沒准一會就生氣了。就跟六月的天似的,說變就變。
封裝一下MM的狀態:smile,cry,say;MM的狀態決定了這些方法該怎么執行.
 
2.代碼:                    
Boy.java:
package com.cy.dp.state;

public class Boy {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
}
View Code

狀態類:State.java(抽象類,具體實現交給子類)

//狀態類
public abstract class State {
    public abstract void smile();
    public abstract void cry();
    public abstract void say();
}

HappyState.java (高興狀態)

package com.cy.dp.state;

public class HappyState extends State {

    @Override
    public void smile() {
        // happy smile
        
    }

    @Override
    public void cry() {
        // happy cry
        
    }

    @Override
    public void say() {
        // happy say
        
    }

}
View Code

UnHappyState.java (不高興狀態)

package com.cy.dp.state;

public class UnHappyState extends State {

    @Override
    public void smile() {
        // unhappy smile
        
    }

    @Override
    public void cry() {
        // unhappy cry
        
    }

    @Override
    public void say() {
        // unhappy say
        
    }

}
View Code

MM.java:

package com.cy.dp.state;

public class MM {
    private String name;
    private State state = new HappyState();
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    public void smile(){
        state.smile();
    }
    public void cry(){
        state.cry();
    }
    public void say(){
        state.cry();
    }
    
}

 

3.小結:              

state用的也並不多;簡單用一句話解釋,就是:一個類的動作是根據這個類的內部狀態的不同,而有不同的動作。
 
疑問:
1.這跟策略模式有什么區別啊?不同的策略我就怎么執行唄。
2.這不就是一個簡單的多態的應用嗎?
 
答:
沒錯,設計模式很多時候區分這個還是那個,往往是在語義上的區分而不是語法上的區分,比如說這里咱們說清楚了這就是不同的狀態下我們執行不同的方法,那就是State模式。
當然, 你說我不同的策略使用不同的方法,哭的策略使用哭的方法,高興的策略用高興的方法,也能說得過去;所以在這點上不要咬文嚼字。理解它是什么意思就夠了;
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM