Javaã«ãããã¶ã¤ã³ãã¿ã¼ã³ã®6åç®ã§ãï¼
ä»åãææã¯ãåèæç®ã®ãJavaè¨èªã§å¦ã¶ãã¶ã¤ã³ãã¿ã¼ã³å
¥é第3çãã®ãµã³ãã«ã³ã¼ãã使ããã¦é ãã¾ãã
ä»åã¯ãStateãã¿ã¼ã³ã§ããç¶æ
é·ç§»ã表ç¾ããã®ã«ä¾¿å©ãªãã¿ã¼ã³ã§ãç解ãããããã¿ã¼ã³ã ã¨æãã¾ãã
ã§ã¯ããã£ã¦ããã¾ãããï¼
åèæç®
åèæç®ã®ãµã³ãã«ããã°ã©ã ã®ãã¦ã³ãã¼ã
www.hyuki.com
ã¯ããã«
ãJavaã§ãã¶ã¤ã³ãã¿ã¼ã³ãå¦ã¶ãã®è¨äºä¸è¦§ã§ããè¯ãã£ããåèã«ãã¦ãã ããã
Javaã§ãã¶ã¤ã³ãã¿ã¼ã³ã®è¨äºä¸è¦§
å
ã«ã23種é¡ã®ãã¶ã¤ã³ãã¿ã¼ã³ã示ãã¾ãã
åèãµã¤ãï¼デザインパターン (ソフトウェア) - Wikipedia
ãã¶ã¤ã³ãã¿ã¼ã³ä¸è¦§
âçæã«é¢ãããã¿ã¼ã³
ãã»Abstract Factoryï¼é¢é£ããã¤ã³ã¹ã¿ã³ã¹ãç¶æ³ã«å¿ãã¦ãé©åã«çæããæ¹æ³ãæä¾ãã
ãã»Builderï¼è¤ååãããã¤ã³ã¹ã¿ã³ã¹ã®çæéç¨ãé è½ããã
ãã»Factory Methodï¼çæãããã¤ã³ã¹ã¿ã³ã¹ã«ä¾åããªããã¤ã³ã¹ã¿ã³ã¹ã®çææ¹æ³ãæä¾ãã
ãã»Prototypeï¼åæ§ã®ã¤ã³ã¹ã¿ã³ã¹ãçæããããã«ãååã®ã¤ã³ã¹ã¿ã³ã¹ãè¤è£½ãã
ãã»Singletonï¼ããã¯ã©ã¹ã«ã¤ãã¦ãã¤ã³ã¹ã¿ã³ã¹ã1ã¤ããåå¨ããªããã¨ãä¿è¨¼ãã
âæ§é ã«é¢ãããã¿ã¼ã³
ãã»Adapterï¼å
ã
é¢é£æ§ã®ãªã2ã¤ã®ã¯ã©ã¹ãæ¥ç¶ããã¯ã©ã¹ãä½ã
ãã»Bridgeï¼ã¯ã©ã¹ã¨å¼ã³åºãå´ã®éã®æ©æ¸¡ããããã¯ã©ã¹ã§ãå®è£
ãé è½ãã
ãã»Compositeï¼å帰çãªæ§é ã表ç¾ãã
ãã»Decoratorï¼ããã¤ã³ã¹ã¿ã³ã¹ã«å¯¾ããåçã«ä»å æ©è½ã追å ãã
ãã»Facadeï¼è¤æ°ã®ãµãã·ã¹ãã ã®çªå£ã¨ãªãå
±éã®ã¤ã³ã¿ãã§ã¼ã¹ãæä¾ãã
ãã»Flyweightï¼å¤æ°ã®ã¤ã³ã¹ã¿ã³ã¹ãå
±æããã¤ã³ã¹ã¿ã³ã¹ã®æ§ç¯ã®ããã®è² è·ãæ¸ãã
ãã»Proxyï¼å
±éã®ã¤ã³ã¿ãã§ã¼ã¹ãæã¤ã¤ã³ã¹ã¿ã³ã¹ãå
å
ããå©ç¨è
ããã®ã¢ã¯ã»ã¹ã代çãããWrapperã¨ãå¼ã°ãã
âæ¯ãèãã«é¢ãããã¿ã¼ã³
ãã»Chain of Responsibilityï¼ã¤ãã³ãã®éåä¿¡ãè¡ãè¤æ°ã®ãªãã¸ã§ã¯ããéç¶ã«ã¤ãªãããããã®éãã¤ãã³ãã渡ããã¦ããããã«ãã
ãã»Commandï¼è¤æ°ã®ç°ãªãæä½ã«ã¤ãã¦ãããããã«å¯¾å¿ãããªãã¸ã§ã¯ããç¨æãããªãã¸ã§ã¯ããåãæ¿ãããã¨ã§ãæä½ã®åãæ¿ããå®ç¾ãã
ãã»Interpreterï¼æ§æ解æã®ããã«ãææ³è¦åãåæ ããã¯ã©ã¹æ§é ãä½ã
ãã»Iteratorï¼è¤æ°ã®è¦ç´ ãå
å
ãããªãã¸ã§ã¯ãã®ãã¹ã¦ã®è¦ç´ ã«å¯¾ãã¦ãé çªã«ã¢ã¯ã»ã¹ããæ¹æ³ãæä¾ãã
ãã»Mediatorï¼ãªãã¸ã§ã¯ãéã®ç¸äºä½ç¨ã仲ä»ãããªãã¸ã§ã¯ããå®ç¾©ãããªãã¸ã§ã¯ãéã®çµå度ãä½ããã
ãã»Mementoï¼ãã¼ã¿æ§é ã«å¯¾ããä¸é£ã®æä½ã®ãããããè¨é²ãã¦ããã以åã®ç¶æ
ã®å¾©å¸°ã¾ãã¯æä½ã®åç¾ãè¡ããããã«ãã
ãã»Observerï¼ã¤ã³ã¹ã¿ã³ã¹ã®å¤åãä»ã®ã¤ã³ã¹ã¿ã³ã¹ããç£è¦ã§ããããã«ãã
ãã»Stateï¼ãªãã¸ã§ã¯ãã®ç¶æ
ãå¤åããããã¨ã§ãå¦çå
容ãå¤ããããããã«ãã
ãã»Strategyï¼ãã¼ã¿æ§é ã«å¯¾ãã¦é©ç¨ããä¸é£ã®ã¢ã«ã´ãªãºã ãã«ãã»ã«åããã¢ã«ã´ãªãºã ã®åãæ¿ãã容æã«ãã
ãã»Template Methodï¼ã¢ã«ã´ãªãºã ã¯æ½è±¡ã¯ã©ã¹ã§ãå¦çå
容ã¯ãµãã¯ã©ã¹ã§å®ç¾©ãã
ãã»Visitorï¼ãã¼ã¿æ§é ãä¿æããã¯ã©ã¹ã¨ãããã«å¯¾ãã¦å¦çãè¡ãã¯ã©ã¹ãåé¢ãã
ä»åã¯ããStateãã¿ã¼ã³ãããã£ã¦ããã¾ãï¼
ãµã³ãã«ã³ã¼ãã®ç解
Stateãã¿ã¼ã³ã¯ãç¶æ
ãããããã®ç¶æ
ã«å¿ãã¦æ¯ãèããå¤ãããããªå ´åã«ä½¿ãã¾ãã
ä»åã®ãµã³ãã«ã³ã¼ãã®å ´åã¯ãæéã®æ¦å¿µãããã1æéãã¤çµéãã¦ããã¾ããæéã¨ã¨ãã«æ¼éã¨å¤éã¨å¤åããããããã§æ¯ãèããå¤ããå
容ã«ãªã£ã¦ãã¾ãã
æ¼éã®å ´åã¯ããããæ¯ãèãããã¦ãå¤éã®å ´åã¯ããããæ¯ãèãããããã¨ããå®è£
ã¯ãifæã«ããåå²ã§å®ç¾ãããå ´åãå¤ãã¨æãã¾ãããStateãã¿ã¼ã³ã使ãã¨ãæ¼éã¨å¤éã§ããããã«æ¯ãèããå®è£
ãã¦ãããStateã«ãã£ã¦æ¯ãèããå¤ããä»çµã¿ã«ãªã£ã¦ãã¾ãã
ã§ã¯ãå®éã«ããµã³ãã«ã³ã¼ããè¦ã¦ãããã¨ã«ãã¾ãã
ä»åã®PlantUMLã®ã¯ã©ã¹å³
PlantUMLã§ä½æããã¯ã©ã¹å³ã®ã³ã¼ãã¨ç»åãã¡ã¤ã«ã§ãã
@startuml
interface State {
+ {abstract} void doClock()
+ {abstract} void doUse()
+ {abstract} void doAlarm()
+ {abstract} void doPhone()
}
class DayState {
- {static} DayState singleton
+ DayState()
+ {static} State getInstance()
+ void doClock()
+ void doUse()
+ void doAlarm()
+ void doPhone()
}
State <|.. DayState
class NightState {
- {static} NightState singleton
+ NightState()
+ {static} State getInstance()
+ void doClock()
+ void doUse()
+ void doAlarm()
+ void doPhone()
+ String toString()
}
State <|.. NightState
interface Context {
+ {abstract} void setClock()
+ {abstract} void changeState()
+ {abstract} void callSecurityCenter()
+ {abstract} void recordLog()
}
class SafeFrame {
- TextField textClock
- TextArea textScreen
- Button buttonUse
- Button buttonAlarm
- Button buttonPhone
- Button buttonExit
- State state
+ SafeFrame()
+ void actionPerformed()
+ void setClock()
+ void changeState()
+ void callSecurityCenter()
+ void recordLog()
}
Context <|.. SafeFrame
SafeFrame o- State
@enduml
Mainã¯ã©ã¹ï¼ä½¿ãå´ã®ã¯ã©ã¹ï¼
ã¾ãã¯ãStateãã¿ã¼ã³ããã©ã®ããã«ä½¿ãããã®ããè¦ãããã«ãMainã¯ã©ã¹ãè¦ã¦ããã¾ãã
åããããããªãã¨æãã®ã§ãå
ã«å®è¡çµæã示ãã¾ãã
public class Main {
public static void main(String[] args) {
SafeFrame frame = new SafeFrame("State Sample");
while (true) {
for (int hour = 0; hour < 24; hour++) {
frame.setClock(hour);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
}
}
}
å®è¡çµæ
ä»åã®ãµã³ãã«ã³ã¼ãã¯ãGUIã®Javaããã°ã©ã ã§ããã
SafeFrameã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ãä½ãããã¨ã¯ç¡éã«ã¼ãã§ãã
ã«ã¼ãã®ä¸ã§ã¯ã1ç§ã«1åã1æéãã¤æéãé²ãã¦ããããã§ããå®éã«GUIã®ã¦ã£ã³ãã¦ã®ãç¾å¨æå»ã¯xx:xxãã¨ãã表示ã¯1ç§ãã¨ã«1æéãã¤é²ãã§ãã¾ããã
ã¾ãããé庫使ç¨ãããé常ãã«ãããé常é話ãã®ãã¿ã³ãæ¼ãã¨ãã¿ã¼ããã«ã«ããããã®ãã°ããã¿ã³ãæ¼ããã¿ã¤ãã³ã°ã§è¡¨ç¤ºããã¦ãã¾ããã
ããå°ãä¸èº«ãè¦ã¦ããã¾ãã
Contextã¯ã©ã¹
Contextã¯ã©ã¹ã¯ãã¤ã³ã¿ã¼ãã§ã¼ã¹ã§ãã
4ã¤ã®æ½è±¡ã¡ã½ãããå®ç¾©ãã¦ãã¾ãã
public interface Context {
public abstract void setClock(int hour);
public abstract void changeState(State state);
public abstract void callSecurityCenter(String msg);
public abstract void recordLog(String msg);
}
次ã¯ãContextã¯ã©ã¹ã®ã¤ã³ã¿ãã§ã¼ã¹ãå®è£
ãã¦ããã¯ã©ã¹ãè¦ã¦ããã¾ãã
SafeFrameã¯ã©ã¹
Contextã¯ã©ã¹ã®ã¤ã³ã¿ãã§ã¼ã¹ãå®è£
ããSafeFrameã¯ã©ã¹ã§ãã
GUIã®é¨åãå®è£
ãã¦ãã¾ãã
ãã©ã¤ãã¼ãã¡ã³ãå¤æ°ã¨ãã¦ãGUIé¨åã®æå»ã表示ãã¦ããããã¹ããã£ã¼ã«ãããã°ã表示ãã¦ããããã¹ãã¨ãªã¢ãé庫使ç¨ãã¿ã³ãé常ãã«ãã¿ã³ãé常é話ãã¿ã³ãçµäºãã¿ã³ãå®ç¾©ãã¦ãã¾ãã
ããã«ããã©ã¤ãã¼ãã¡ã³ãå¤æ°ã¨ãã¦ãDayStateã¯ã©ã¹ï¼æ¼éã®ç¶æ
ï¼ã®ã¤ã³ã¹ã¿ã³ã¹ãåå¾ãã¦ãã¾ããDayStateã¯ã©ã¹ã¯å¾è¿°ãã¾ãããã·ã³ã°ã«ãã³ãã¿ã¼ã³ãå®è£
ãã¦ãã¾ãã
ã³ã³ã¹ãã©ã¯ã¿ã§ã¯ãGUIé¨åã®åæåã¨ãã¤ãã³ãï¼ãªã¹ãã¼ï¼ã®åæåãè¡ã£ã¦ãã¾ããã³ã¡ã³ããæ¸ããã¦ããã®ã§ã詳細ã®èª¬æã¯çç¥ããã¦ããã ãã¾ãã
actionPerformed()
ã¯ãã¤ãã³ããçºçãããå¼ã°ããã¡ã½ããã§ã4ã¤ã®ãã¿ã³ãæ¼ãããã¨ãã®ããããã®è¡åã決ãã¦ãã¾ããDayStateã¯ã©ã¹ã®ã¡ã½ãããå¼ã³åºãã¦ããããã§ãã
ãã¨ã¯ãContextã¯ã©ã¹ã§å®ç¾©ãã¦ããã¤ã³ã¿ãã§ã¼ã¹ãå®è£
ããã¡ã½ããã4ã¤ããã¾ãã
setClock()
ã§ã¯ãMainã¯ã©ã¹ããæéã渡ããã¦ããããGUIé¨åã®ç¾å¨æå»è¡¨ç¤ºã«åæ ãã¦ãDayStateã¯ã©ã¹ã® doClock()
ãå¼ã³åºãã¦ãã¾ãã
changeState()
ã§ã¯ã渡ãããstateããã©ã¤ãã¼ãã¡ã³ãå¤æ°ã«è¨å®ãã¦ãã¾ããæå㯠DayStateã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ï¼æ¼éã®ç¶æ
ï¼ãè¨å®ãã¦ãã¾ããããæéãå¤éã«ãªã£ããããã®ã¡ã½ããã§ãNightStateã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ï¼å¤éã®ç¶æ
ï¼ãè¨å®ãã¾ãã
callSecurityCenter()
ã§ã¯ãé常ãã«ãã¿ã³ãæ¼ãããå ´åã«ãStateã¯ã©ã¹ã® doAlarm()
ãå¼ã³åºããããããããã®ã¡ã½ãããå¼ã°ãã¾ããGUIã®ããã¹ãã¨ãªã¢ã«ã¡ãã»ã¼ã¸ãè¨å®ãã¦ãã¾ãã
recordLog()
ã¯ãcallSecurityCenter()
ã¨åæ§ã§ãé常é話ãã¿ã³ãæ¼ãããã¨ãStateã¯ã©ã¹ã® doPhone()
ãå¼ã³åºããããããããã®ã¡ã½ãããå¼ã°ãã¾ããåãããã«ãGUIã®ããã¹ãã¨ãªã¢ã«ã¡ãã»ã¼ã¸ãè¨å®ãã¦ãã¾ãã
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class SafeFrame extends Frame implements ActionListener, Context {
private TextField textClock = new TextField(60);
private TextArea textScreen = new TextArea(10, 60);
private Button buttonUse = new Button("é庫使ç¨");
private Button buttonAlarm = new Button("é常ãã«");
private Button buttonPhone = new Button("é常é話");
private Button buttonExit = new Button("çµäº");
private State state = DayState.getInstance();
public SafeFrame(String title) {
super(title);
setBackground(Color.lightGray);
setLayout(new BorderLayout());
add(textClock, BorderLayout.NORTH);
textClock.setEditable(false);
add(textScreen, BorderLayout.CENTER);
textScreen.setEditable(false);
Panel panel = new Panel();
panel.add(buttonUse);
panel.add(buttonAlarm);
panel.add(buttonPhone);
panel.add(buttonExit);
add(panel, BorderLayout.SOUTH);
pack();
setVisible(true);
buttonUse.addActionListener(this);
buttonAlarm.addActionListener(this);
buttonPhone.addActionListener(this);
buttonExit.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e.toString());
if (e.getSource() == buttonUse) {
state.doUse(this);
} else if (e.getSource() == buttonAlarm) {
state.doAlarm(this);
} else if (e.getSource() == buttonPhone) {
state.doPhone(this);
} else if (e.getSource() == buttonExit) {
System.exit(0);
} else {
System.out.println("?");
}
}
@Override
public void setClock(int hour) {
String clockstring = String.format("ç¾å¨æå»ã¯%02d:00", hour);
System.out.println(clockstring);
textClock.setText(clockstring);
state.doClock(this, hour);
}
@Override
public void changeState(State state) {
System.out.println(this.state + "ãã" + state + "ã¸ç¶æ
ãå¤åãã¾ããã");
this.state = state;
}
@Override
public void callSecurityCenter(String msg) {
textScreen.append("call! " + msg + "\n");
}
@Override
public void recordLog(String msg) {
textScreen.append("record ... " + msg + "\n");
}
}
Stateã¯ã©ã¹
Stateã¯ã©ã¹ã¯ãã¤ã³ã¿ã¼ãã§ã¼ã¹ã§ãã
4ã¤ã®æ½è±¡ã¡ã½ãããå®ç¾©ãã¦ãã¾ãã
public interface State {
public abstract void doClock(Context context, int hour);
public abstract void doUse(Context context);
public abstract void doAlarm(Context context);
public abstract void doPhone(Context context);
}
DayStateã¯ã©ã¹
Stateã¯ã©ã¹ã®ã¤ã³ã¿ãã§ã¼ã¹ãå®è£
ããDayStateã¯ã©ã¹ã§ãã
DayStateã¯ã©ã¹ï¼æ¼éã®ç¶æ
ï¼ã¯ãã·ã³ã°ã«ãã³ã®ãã¿ã¼ã³ã使ã£ã¦ãã¾ããstaticãªãã©ã¤ãã¼ãã¡ã³ãå¤æ°ã¨ãã¦ãèªåèªèº«ã®ã¤ã³ã¹ã¿ã³ã¹ãæã¡ãstatic㪠getInstance
ã§ã¤ã³ã¹ã¿ã³ã¹ãåå¾ã§ãã¾ãã
ã³ã³ã¹ãã©ã¯ã¿ã¯ä½ããã¦ããªãã§ããã
Stateã¯ã©ã¹ã§å®ç¾©ããã¦ãã4ã¤ã®å
·è±¡ã¡ã½ãããå®è£
ãã¦ãã¾ãã
doClock()
ã§ã¯ã17æãã23æããããã¯ã0æãã8æãªããStateã NightState
ï¼å¤éã®ç¶æ
ï¼ã«å¤ãã¦ãã¾ãããã®ã¯ã©ã¹ã¨åæ§ãNightStateã¯ã©ã¹ãã·ã³ã°ã«ãã³ã®ãã¿ã¼ã³ã使ã£ã¦ãã¦ãNightStateã¯ã©ã¹ã® getInstance()
ã§ãNightStateã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ãåå¾ãããã¨ãã§ãã¾ãã
doUse()
ã§ã¯ãSafeFrameã¯ã©ã¹ã® recordLog()
ãå¼ã³åºãã¦ãã¾ããå
ã»ã©è¦ãããã«ãSafeFrameã¯ã©ã¹ã® recordLog()
ã§ã¯ãGUIé¨åã®ããã¹ãã¨ãªã¢ã«ã¡ãã»ã¼ã¸ãè¨å®ãã¦ãã¾ããã
doAlarm()
ã¨ãdoPhone()
ãåæ§ã§ãSafeFrameã¯ã©ã¹ã®ã¡ã½ãããå¼ã³åºãã¦ãã¦ãããã§GUIé¨åã®ããã¹ãã¨ãªã¢ã«ã¡ãã»ã¼ã¸ãè¨å®ãã¦ãã¾ãã
æå¾ã« toString()
ã¯ãã¤ã³ã¹ã¿ã³ã¹ãæååã¨ãã¦ä½¿ãããå ´åã«å¼ã°ããã¡ã½ããã§ãã"æ¼é"ã¨ããæååãè¿ãã¦ãã¾ãã
public class DayState implements State {
private static DayState singleton = new DayState();
private DayState() {
}
public static State getInstance() {
return singleton;
}
@Override
public void doClock(Context context, int hour) {
if (hour < 9 || 17 <= hour) {
context.changeState(NightState.getInstance());
}
}
@Override
public void doUse(Context context) {
context.recordLog("é庫使ç¨(æ¼é)");
}
@Override
public void doAlarm(Context context) {
context.callSecurityCenter("é常ãã«(æ¼é)");
}
@Override
public void doPhone(Context context) {
context.callSecurityCenter("é常ã®é話(æ¼é)");
}
@Override
public String toString() {
return "[æ¼é]";
}
}
NightStateã¯ã©ã¹
Stateã¯ã©ã¹ã®ã¤ã³ã¿ãã§ã¼ã¹ãå®è£
ããNightStateã¯ã©ã¹ã§ãã
DayStateã¯ã©ã¹ã¨ã»ã¨ãã©åããªã®ã§ãéããããã¨ããã ã説æãã¾ãã
DayStateã¯ã©ã¹ã® doClock()
ã§ã¯ã17æãã23æããããã¯ã0æãã8æãªããStateã NightState
ï¼å¤éã®ç¶æ
ï¼ã«å¤ãã¦ãã¾ããããNightStateã¯ã©ã¹ã® doClock()
ã§ã¯ãéã«ã9æãã16æã®å ´åã«ãState ã DayState
ï¼æ¼éã®ç¶æ
ï¼ã«å¤ãã¦ãã¾ãã
ãã¨ã¯ãå¤ãç°ãªãã ãã§ããã£ã¦ãããã¨ã¯DayStateã¯ã©ã¹ã¨åãã§ãã
public class NightState implements State {
private static NightState singleton = new NightState();
private NightState() {
}
public static State getInstance() {
return singleton;
}
@Override
public void doClock(Context context, int hour) {
if (9 <= hour && hour < 17) {
context.changeState(DayState.getInstance());
}
}
@Override
public void doUse(Context context) {
context.callSecurityCenter("é常ï¼å¤éã®é庫使ç¨ï¼");
}
@Override
public void doAlarm(Context context) {
context.callSecurityCenter("é常ãã«(å¤é)");
}
@Override
public void doPhone(Context context) {
context.recordLog("å¤éã®é話é²é³");
}
@Override
public String toString() {
return "[å¤é]";
}
}
ã½ã¼ã¹ã³ã¼ãã®éãå¤ãã£ãã®ã§ãStateãã¿ã¼ã³ã«ã¤ãã¦ãããã§èãã¦ã¿ããã¨æãã¾ãã
Stateãå¤åãããã¨ãã¤ã³ã¿ãã§ã¼ã¹ãåãå¥ã®ã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ã®ã¡ã½ãããå¼ã°ããã¨ããããStateãã¿ã¼ã³ã®ç¹å¾´ã§ããã
ç¶æ
ãå¢ããã¨ãã¦ããããããã®ã¡ã½ããã®ifæã®åå²ãå¢ããã®ã§ã¯ãªããStateã¯ã©ã¹ãç¶æ¿ããã¯ã©ã¹ãå¢ãããã¨ã§å¯¾å¿ãã§ãã¾ããè¤éãªç¶æ
é·ç§»ãæã¤ã·ã¹ãã ã®å ´åã§ãããã£ããã¨å®è£
ã§ãããã§ãã
ãããã«
ä»åã¯Stateãã¿ã¼ã³ãå¦ã³ã¾ããã
Stateãã¿ã¼ã³ã®ãµã³ãã«ã³ã¼ãã¯ããã£ã¦ããã¨ãæ確ã§ãåãããããã£ãã§ããã
ä»åã¯ä»¥ä¸ã§ãï¼
æå¾ã¾ã§ãèªã¿ããã ãããããã¨ããããã¾ããã