行为模式涉及到算法和对象间职责的分配。
state:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。
package behaviour.state;
/**
* A concrete state for generating bill
*/
import java.io.*;
public class GenerateBill extends ShopState {
public static boolean instanceFlag = false; //true if have 1 instance
private GenerateBill() {
}
public static GenerateBill getInstance() {
if(! instanceFlag) {
instanceFlag = true;
return new GenerateBill();
}
return null;
}
public void generateBill() {
System.out.println("The state is generating bill now !");
}
}
package behaviour.state;
/**
* A state interface
* 用户在网上购物的状态变化:
* 选择商品 --> 生成订单 --> 付款取货
*/
public interface IShopState {
public void shop();
public void generateBill();
public void pay();
//protected void changeState(ShopContext c, IShopState);
}
package behaviour.state;
/**
* A concrete state for customer shopping
*/
import java.io.*;
public class Pay extends ShopState {
public static boolean instanceFlag = false; //true if have 1 instance
private Pay() {
}
public static Pay getInstance() {
if(! instanceFlag) {
instanceFlag = true;
return new Pay();
}
return null;
}
public void pay() {
System.out.println("The state is pay now !");
}
}
package behaviour.state;
/**
* A concrete state for customer shopping
*/
import java.io.*;
public class Shop extends ShopState {
public static boolean instanceFlag = false; //true if have 1 instance
private Shop() {
}
public static Shop getInstance() {
if(! instanceFlag) {
instanceFlag = true;
return new Shop();
}
return null;
}
public void shop() {
System.out.println("The state is shopping now !");
}
}
package behaviour.state;
/**
* The context for user useing
*/
public class ShopContext {
private ShopState currentState;
public ShopContext() {
}
public void changeState(ShopState s) {
currentState = s;
}
public void shop() {
currentState.shop();
}
public void generateBill() {
currentState.generateBill();
}
public void pay() {
currentState.pay();
}
}
package behaviour.state;
/**
* The parent class of state
*/
public class ShopState implements IShopState {
public ShopState() {
}
public void shop() { }
public void generateBill() { }
public void pay() { }
protected void changeState(ShopContext c, ShopState s) {
c.changeState(s);
}
}
package behaviour.state;
/**
* A test client
*/
public class Test {
public static void main(String[] args) {
ShopContext myContext = new ShopContext();
ShopState myShop = Shop.getInstance();
ShopState myGenBill = GenerateBill.getInstance();
ShopState myPay = Pay.getInstance();
myContext.changeState(myShop);
myContext.shop();
myContext.changeState(myGenBill);
myContext.generateBill();
myContext.changeState(myPay);
myContext.pay();
myShop.changeState(myContext, myPay);
myContext.pay();
}
}