java 狀態模式 講解範例程式碼,java範例程式碼

來源:互聯網
上載者:User

java 狀態模式 講解範例程式碼,java範例程式碼

package org.rui.pattern;import junit.framework.*;/** * 為了使同一個方法調用可以產生不同的行為,State 模式在代理(surrogate)的 * 生命週期內切換它所對應的實現(implementation)。當你發現,在決定如何?任 對象去耦(Object decoupling) * http://blog.csdn.net/lxwde 28 何一個方法之前都必須作很多測試的情況下,這是一種最佳化實現代碼的方法。例如, * 童話故事青蛙王子就包含一個對象(一個生物),這個對象的行為取決於它自己所處 的狀態。你可以用一個布爾(boolean)值來表示它的狀態,測試程式如下: *  * @author Administrator * */class Creature{private boolean isFrog = true;public void greet(){if (isFrog)System.out.println("Ribbet!");elseSystem.out.println("Darling!");}public void kiss(){isFrog = false;}}public class KissingPrincess extends TestCase{Creature creature = new Creature();public void test(){creature.greet();creature.kiss();creature.greet();}public static void main(String args[]){junit.textui.TestRunner.run(KissingPrincess.class);}} // /:~

package org.rui.pattern;import junit.framework.*;/** * 狀態模式:改變對象的行為 一個用來改變類的(狀態的)對象。 跡象:幾乎所有方法裡都出現(相同的)條件(運算式)代碼。 *  *  * 但是,greet() 方法(以及其它所有在完成操作之前必須測試 isFrog 值的那些方 * 法)最終要產生一大堆難以處理的代碼。 * 如果把這些操作都委託給一個可以改變的狀 態對象(State object),那代碼會簡單很多。 *  * @author Administrator * */class Creature2{private interface State{String response();}private class Frog implements State{public String response(){return "Ribbet!";}}private class Prince implements State{public String response(){return "Darling!";}}private State state = new Frog();public void greet(){System.out.println(state.response());}public void kiss(){// 改變對象狀態state = new Prince();}}public class KissingPrincess2 extends TestCase{Creature2 creature = new Creature2();public void test(){creature.greet();creature.kiss();creature.greet();}public static void main(String args[]){junit.textui.TestRunner.run(KissingPrincess2.class);}} // /:~

package org.rui.pattern;import org.junit.Test;import junit.framework.*;/** * 下面的代碼示範了 State 模式的基本結構 */interface State{void operation1();void operation2();void operation3();}class ServiceProvider{private State state;public ServiceProvider(State state){this.state = state;}public void changeState(State newState){state = newState;System.out.println("========changeState==========="+ newState.getClass().getSimpleName());}// 通過方法調用實現public void service1(){// ...state.operation1();// ...state.operation3();}public void service2(){// ...state.operation1();// ...state.operation2();}public void service3(){// ...state.operation3();// ...state.operation2();}}class Implementation1 implements State{public void operation1(){System.out.println("Implementation1.operation1()");}public void operation2(){System.out.println("Implementation1.operation2()");}public void operation3(){System.out.println("Implementation1.operation3()");}}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()");}}public class StateDemo extends TestCase{static void run(ServiceProvider sp){sp.service1();sp.service2();sp.service3();}ServiceProvider sp = new ServiceProvider(new Implementation1());@Testpublic void test(){run(sp);sp.changeState(new Implementation2());run(sp);}/* * public static void main(String args[]) { * junit.textui.TestRunner.run(StateDemo.class); } */} // /:~/* * 在 main( )函數裡,先用到的是第一個實現,然後轉入第二個實現。 當你自己實現 State 模式的時候就會碰到很多細節的問題,你必鬚根據自己的需 * 要選擇合適的實現方法,比如用到的狀態(State)是否要暴露給調用的客戶,以及如 何使狀態發生變化。有些情況下(比如 Swing 的 * LayoutManager),,用戶端可以直接 傳對象進來,但是在 KissingPrincess2.java 那個例子裡,狀態對於用戶端來說是不 * 可見的。此外,用於改變狀態的機制可能很簡單也可能很複雜-比如本書後面將要提 到的狀態機器(State * Machine),那裡會講到一系列的狀態以及改變狀態的不同機制。 上面提到 Swing 的 LayoutManager 那個例子非常有趣,它同時體現了 * Strategy 模 式和 State 模式的行為。 Proxy 模式和 State 模式的區別在於它們所解決的問題不同。《設計模式》裡是這 麼描述 * Proxy 模式的一般應用的: 1. 遠程代理(Remote Proxy)為一個對象在不同的地址空間提供局部代理。 RMI 編譯器(rmic)在建立 * stubs 和 skeletons 的時候會自動為你建立一 個遠端代理。 2. 虛代理(Virtual proxy),根據需要,在建立複雜物件時使用 * “延遲初 始化(lazy initialization)” . 3. 保護代理(protection proxy) 用於你不希望用戶端程式員完全控制被代 * 理對象(proxied object)的情況下。 4. 智能引用(smart reference). 當訪問被代理對象時提供額外的動作。 * 例如,它可以用來對特定對象的引用進行計數,從而實現寫時複製 (copy-on-write),進而避免對象別名(object aliasing). 更簡單的 * 一個例子是用來記錄一個特定方法被調用的次數。 你可以把 java 裡的引用(reference)看作是一種保護代理,它控制對分配在堆 * (heap)上的實際對象的訪問(而且可以保證你不會用到一個Null 參考(null reference))。 『重寫:在《設計模式》一書裡,Proxy 模式和 * State 模式被認為是互不相干的, 因為那本書給出的用以實現這兩種模式的結構是完全不同的(我認為這種實現有點武 斷)。尤其是 State * 模式,它用了一個分離的實現階層,但我覺著完全沒有必 要,除非你認定實現代碼不是由你來控制的(當然這也是一種可能的情況,但是如果 * 代碼是由你來控制的,那還是用一個單獨的基類更簡潔實用)。此外,Proxy 模式的實 * 現不需要用一個公用的基類,因為代理對象只是控制對被代理對象的訪問。儘管有細 節上的差異,Proxy 模式和 State * 模式都是用一個代理(surrogate)把方法調用傳遞 給實現對象。』 */


找Java狀態模式應用的例子,啦

1,狀態模式允許一個"對象"在其內部狀態改變的時候改變其行為。
2,狀態模式的角色:
抽象狀態,具體狀態(一般是幾個,每一個狀態下有不同的行為,),環境(context)角色(就是對象,什麼對象的狀態,一般該對象要初始化一個狀態,還有改變狀態,還有該狀態下的行為)

我們打籃球的時候運動員可以有正常狀態,不正常狀態,和超常狀態,現在我們就以我們打籃球時候投籃時候的狀態來舉例子,

首先我們抽象出狀態,以及該狀態下的行為,
interface State{
public void shot();
}
然後實現具體狀態,我們這裡有三個,三種狀態三種行為。
不正常
public class NonormalState implements State{
public void shot(){
System.out.println("今天你投籃十中一");
}
}
正常:
public class NormalState implements State{
public void shot(){
System.out.println("今天你投籃十中五");
}
}
超常:
public class SuperState implements State{
public void shot(){
System.out.println("今天你投籃十中十");
}
}
這個時候我們來一個環境,一個運動員,正常情況下是正常狀態
public class Player{
private State state=new NormalState();
public void setState(State state){
this.state=state;
}
public void shot(){
state.shot();//這裡我感覺是建立型模式的適配器模式,對象適配器。應該就是這樣,
}
}
測試這個例子
public class StateTest
{
public static void main(String[] args){
Player player=new Player();
player.shot();//正常下投籃
player.setState(new NonormalState());
player.shot();不正常下投籃
player.setState(new SuperState());
player.shot();超常下投籃
}
}
 
java中的設計模式有那些,詳細講解一下

設計模式源於《Design Patterns: Elements of Reusable Object-Oriented Software》一書提到的23種設計模式,

根據模式的目的將23種模式分為三類:建立型(Creational),結構型(Structural)和行為型(Behavioral)模式。

建立型(Creational):
建立型模式是用來建立對象的。我們在coding時經常要對類進行執行個體化, 建立型模式就是提供提供各種不同的solution,從執行個體化的代碼中去除寫入程式碼(hard-coding), 從而使編碼更加靈活和general, 適用於更複雜的行為。包括 ·Factory Method ·Abstract Factory Method ·Builder Pattern ·Prototype Pattern ·Singleton

結構型(Structural)
結構型模式處理類或對象的組合來獲得更大的結構。包括 · Adapter pattern · Composite pattern, · Proxy pattern, · Flyweight pattern, · Façade pattern, · Bridge pattern, · Decorator pattern,

行為型(Behavioral)
行為型模式處理類或對象如何互動 · 包括:Observer pattern · Mediator · Memento · Chain of Responsibility · Template pattern · Interpreter in a program. · Strategy pattern · Visitor pattern · State pattern · Command pattern · Iterator pattern

太多了,建議你找本書自己研究研究,例如《Java與模式》,《Head first 設計模式》,
不過設計模式最好在你把語言用得比較熟練了再去學,不然亂用反而造成代碼難以閱讀。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.