"Product": Role 名
関数名 CreateProduct の Product と対応
ConcreteFactory::CreateProduct() {
return new "Product" ( )
}
"objects": 変数?
"structure": 未定義
"builder": Role Builder への aggregate のラベル
"BuildPart": Role Builder のフック関数名
Role ConcreteBuilder で実装される
Part は objects の型と対応している様子
Directo::Construct() {
for all "objects" in "structure"
"builder" . "BuildPart" ( )
}
部品への関係が省略されているので
具体的な疑似コードを書くのは難しい.
"product": この関数内でのみ使われる一時的な変数名
"FactoryMethod": Role Creator のフック関数名
Role ConcreteCreator で実装される
CreateAbstractClassName という名前が多い
Iterator Pattern の Iterator::CreateIterator() もこれ
Creator::AnOperation() {
...
"product" = "FactoryMethod" ( )
...
}
"ConcreteProduct": Role 名
Role ConcreteCreator と関連のある名前を
つける場合が多いがそうでない場合もある
ConcreteCreator::FactoryMethod() {
return new "ConcreteProduct" ( )
}
"p": この関数内でのみ使われる一時的な変数名
"prototype": Role Prototype への参照のラベル
"Clone": Role Prototype のフック関数名
Role ConcretePrototype で実装される
通常この名前そのまま.
Client::Operation() {
...
"p" = "prototype" . "Clone" ( )
...
}
ConcretePrototype::Clone() {
return copy of self
}
Clone は余りにバリエーションがあり過ぎて
疑似コードにするのが難しい.
Singleton::Instance() { # static 関数
return "uniqueInstance"
}
保留
クラスに適用する Adaptor パターン
"SpecificRequest": Role Adaptee で実装される任意の関数
既にあるもの
Adaptor::Request() {
"SpecificRequest" ( )
}
オブジェクトに適用する Adaptor パターン
"adapter": Role Adaptee への参照のラベル
"SpecificRequest": Role Adaptee で実装される任意の関数
既にあるもの
Adapter::Request() {
"adapter" . "SpecificRequest" ( )
}
"imp": Role Implementor への aggregate のラベル
"OperationImp": Role Implementor のフック関数
Role ConcreteImplementor で実装される
呼んでいる関数名となんか似たような名前にするべき
だとは思う…
Abstraction::Operation() {
"imp" . "OperationImp" ( )
}
"g": 集約の要素ひとつを取り出して置いておくための変数
"children": Role Component への aggregate (集約) のラベル
"Operation": Role Component のフック関数
SubRole Leaf, Composite で実装される
呼んでいる関数名と同名
Composite::Operation() {
for all "g" in "children"
"g" . "Operation" ( )
}
"component": Role Component への aggregate (単数)のラベル
"Operation": Role Component のフック関数
SubRole ConcreteComponent, Decorator, 更に
ConcreteDecorator で実装される
呼んでいる関数名と同名
Decorator::Operation() {
"component" . "Operation" ( )
}
ConcreteDecorator::Operation() {
"Decorator" :: "Operation" ( )
"AddedBehaivior" ( )
}
一切の疑似コードはなし
"flyweights": Role Flyweight への aggregate (集約)のラベル
"key": 引数,文字とかハッシュ値とかそんなようなもの
"flyweight": 新規の Flyweight を入れとく一時的な変数
"Flyweight": Role 名
FlyweightFactory::GetFlyweight(key) {
if ( "flyweights" [ "key" ] exists ) {
return "flyweights" [ "key" ]
} else {
"flyweight" = new "Flyweight" # ここは怪しいので保留
add "flyweight" to "flyweights"
return "flyweight"
}
}
"realSubject": Role RealSubject への参照のラベル
"Request": Role RealSubject で定義される任意の関数
名前はなんでもいい
Proxy::Request() {
...
"realSubject" . "Request"
...
}
図そのものにはない
"successor": Role Handler への参照のラベル
"HandleRequest": Role Handler のフック関数(半具象)
デフォルトの振舞をもつ
Role ConcreteHandler で実装される
Handler::HandleRequest() {
"successor" . "HandleRequest" ( )
}
ConcreteHandler::HandleRequest() {
if can handle {
"ResolveRequest" ( )
} else {
"Handler" :: "HandleRequest" ( )
}
}
このあたりは保留….
"receiver": Role Receiver への参照のラベル
"Action": Role Receiver で定義される任意の関数
名前はなんでもいい
ConcreteCommand::Execute() {
"receiver" . "Action" ( )
}
特になし?
"ConcreteIterator": Role 名
ConcreteAggregate::CreateIterator() {
return new "ConcreteIterator" ( this )
}
図には記述がない
"target": ConcreteAggregate への参照のラベル(図にはない)
"aggr": 引数
ConcreteIterator::ConcreteIterator(ConcreteAggregate aggr) {
"target" = "aggr"
}
特になし?
"state": メンバ変数
"m": 引数
"GetState": Role Memento で定義される関数
この意味を維持した名前が良い
Originator::SetMemento(Memento m) {
"state" = "m" . "GetState" ( )
}
"Memento": Role 名
"state": メンバ変数
Originator::createMemento() {
return new "Memento" ( "state" )
}
状態を入れておくクラスを補充した方が良さそう…
state のクラス
"o": 変数
"observers": Role Observer への aggregate (集約)のラベル
"Update": Role Observer のフック関数
Role ConcreteObserver で実装されるがみな同じ?
この意味を維持した名前が良い
Subject::Notify() {
for all "o" in "observers"
"o" . "Update"
}
"subjectState": メンバ変数
ConcreteSubject::GetState() {
return "subjectState"
}
"observState": メンバ変数
"subject": Role ConcreteSubject への参照のラベル
"GetState": Role ConcreteSubject ので定義される関数
この意味を維持した名前が良い
ConcreteObserver::Update() {
"observState" = "subject" . "GetState"
}
これも状態を入れておくクラスを補充した方が良さそう…
"state": Role State への aggregate のラベル
"Handle": Role State のフック関数
Role ConcreteState で実装される
名前は自由
Context::Request() {
"state" . "Handle" ( )
}
図には記述がない 余りに一般的すぎるパターン
"strategy": Role Strategy への aggregate のラベル
"AlgorithmInterface": Role Strategy のフック関数
Role ConcreteStrategy で実装される
名前は自由
Context::ContextInterface() {
"strategy" . "AlgorithmInterface" ( )
}
"PrimitiveOperation": Role AbstractClass のフック関数
Role ConcreteClass で実装される
名前は自由
AbstractClass::TempleteMethod() {
...
"PrimitiveOperation" ( )
...
}
"v": 引数
"VisiteConcreteElement": Role Visitor のフック関数
Role ConcreteVisitor で実装される
Visit + Role 名 とすることが多い
ConcreteElement::Accept(Visitor v) {
"v" . "VisiteConcreteElement" ( this )
}