この記事の出所:GitHubにはこちらをクリック・ || GitEEは・こちらをクリック
生活シーン
1、シーン記述
カメレオンは、それは素晴らしいですが、機能や樹上生活に適した行動の多様性を持っている非常に奇妙な動物であり、環境が環境に適応するために色が変化して、体が変化する、爬虫類です。モードは、状態変更処理に基づいて説明します。
図2に示すように、コードの実装
public class C01_InScene {
public static void main(String[] args) {
Chameleon chameleon = new Chameleon("红色","花丛环境") ;
LifeContext lifeContext = new LifeContext() ;
// 树叶环境
BodyColor bodyColor = new GreenColor ();
lifeContext.setBodyColor(bodyColor);
lifeContext.change(chameleon);
// 树枝环境
bodyColor = new GrayColor() ;
lifeContext.setBodyColor(bodyColor);
lifeContext.change(chameleon);
}
}
/**
* 变色龙
*/
class Chameleon {
public String color ;
public String contextDesc ;
public Chameleon(String color, String contextDesc) {
this.color = color;
this.contextDesc = contextDesc;
}
}
/**
* 变色龙生存环境
*/
class LifeContext {
private BodyColor bodyColor;
public void setBodyColor(BodyColor bodyColor) {
this.bodyColor = bodyColor;
}
public void change (Chameleon chameleon){
bodyColor.change(chameleon) ;
}
}
/**
* 变色龙身体颜色抽象类
*/
interface BodyColor {
void change (Chameleon chameleon);
}
/**
* 变色龙身体颜色具体类
*/
class GreenColor implements BodyColor {
@Override
public void change(Chameleon chameleon) {
System.out.println("变化前:"+chameleon.color+";"+chameleon.contextDesc);
chameleon.contextDesc = "树叶环境" ;
chameleon.color = "绿色" ;
System.out.println("变化后:"+chameleon.color+";"+chameleon.contextDesc);
}
}
class GrayColor implements BodyColor {
@Override
public void change(Chameleon chameleon) {
System.out.println("变化前:"+chameleon.color+";"+chameleon.contextDesc);
chameleon.contextDesc = "树枝环境" ;
chameleon.color = "灰色" ;
System.out.println("变化后:"+chameleon.color+";"+chameleon.contextDesc);
}
}
第二に、状態モード
1、基本的な考え方
オブジェクトの状態モデル行動パターン、オブジェクト・モデルは、その内部状態が変化したときの状態は、その動作を変更することを可能にします。異なる状態で封入されたオブジェクト状態モデルオブジェクトの挙動、状態オブジェクトの各状態は、抽象クラスのサブクラスです。その意図は、彼らの行動が変更されたときにオブジェクトがその内部状態を変更することができるようにすることです。
図2に示すように、パターンを示し
3、中核的な役割
- 環境役割
オブジェクトのクラスを保持する特定状態の一例。この特定のクラスの例は、この環境内のオブジェクトの現在の状態の状態が与えられます。
- 抽象状態の役割
インターフェース、オブジェクトの動作に対応した環境のパッケージ状態を定義します。
- 状態の特定の役割
クラスは、環境行動の状態に対応する特定の状態を実装します。
図4に示すように、ソースコードの実装
public class C02_State {
public static void main(String[] args){
Context context = new Context();
State state = new ConcreteStateA() ;
context.setState(state);
context.printInfo("当前环境状态A");
state = new ConcreteStateB();
context.setState(state);
context.printInfo("当前环境状态B");
}
}
/**
* 环境角色
*/
class Context {
private State state;
public void setState(State state) {
this.state = state;
}
public void printInfo (String info) {
state.stateInfo(info);
}
}
/**
* 抽象状态角色
*/
interface State {
void stateInfo (String param);
}
/**
* 具体状态角色
*/
class ConcreteStateA implements State {
@Override
public void stateInfo (String info) {
System.out.println("ConcreteStateA:" + info);
}
}
class ConcreteStateB implements State {
@Override
public void stateInfo (String info) {
System.out.println("ConcreteStateB:" + info);
}
}
第三に、モデルの概要
- 文が容易に問題を解決する場合は、他に、各モードの動作の状態がクラスに対応した状態にカプセル化され、コードは非常に読みやすいがあります。
- 沿って、「開閉の原則、」追加または削除操作、管理状況が容易です。
- ときに多くの状態が存在します。各状態は、対応するクラスでなければなりません、私たちはクラスの多くを持つことになります、増加のメンテナンスが
難しい気。 - シナリオ:イベントまたはオブジェクトは状態の多様性を持っている場合は、状態間の交換となり、異なる状態は、異なる動作を持っている状態モードを使用することを検討してください。
第四に、送信元アドレス
GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent