Lemon Home Page| Pseudo Code

疑似コード一覧

生成に関するパターン

  1. Abstract Factory
    "Product": Role 名
               関数名 CreateProduct の Product と対応
    
    ConcreteFactory::CreateProduct() {
      return new "Product" ( )
    }
    
  2. Builder
    "objects": 変数?
    "structure": 未定義
    "builder": Role Builder への aggregate のラベル
    "BuildPart": Role Builder のフック関数名
                 Role ConcreteBuilder で実装される
                 Part は objects の型と対応している様子
    
    Directo::Construct() {
      for all "objects" in "structure"
        "builder" . "BuildPart" ( )
    }
    
    部品への関係が省略されているので 具体的な疑似コードを書くのは難しい.

  3. Factory Method
    "product": この関数内でのみ使われる一時的な変数名
    "FactoryMethod": Role Creator のフック関数名
                     Role ConcreteCreator で実装される
                     CreateAbstractClassName という名前が多い
                     Iterator Pattern の Iterator::CreateIterator() もこれ
    
    Creator::AnOperation() {
      ...
      "product" = "FactoryMethod" ( )
      ...
    }
    
    "ConcreteProduct": Role 名
                       Role ConcreteCreator と関連のある名前を
                       つける場合が多いがそうでない場合もある
    
    ConcreteCreator::FactoryMethod() {
      return new "ConcreteProduct" ( )
    }
    
  4. Prototype
    "p": この関数内でのみ使われる一時的な変数名
    "prototype": Role Prototype への参照のラベル
    "Clone": Role Prototype のフック関数名
             Role ConcretePrototype で実装される
             通常この名前そのまま.
    
    Client::Operation() {
      ...
      "p" = "prototype" . "Clone" ( )
      ...
    }
    
    ConcretePrototype::Clone() {
      return copy of self
    }
    
    Clone は余りにバリエーションがあり過ぎて 疑似コードにするのが難しい.

  5. Singleton
    Singleton::Instance() { # static 関数
      return "uniqueInstance"
    }
    
    保留

構造に関するパターン

  1. Adapter

    クラスに適用する Adaptor パターン

    "SpecificRequest": Role Adaptee で実装される任意の関数
                       既にあるもの
    
    Adaptor::Request() {
      "SpecificRequest" ( )
    }
    

    オブジェクトに適用する Adaptor パターン

    "adapter": Role Adaptee への参照のラベル
    "SpecificRequest": Role Adaptee で実装される任意の関数
                       既にあるもの
    
    Adapter::Request() {
      "adapter" . "SpecificRequest" ( )
    }
    
  2. Bridge
    "imp": Role Implementor への aggregate のラベル
    "OperationImp": Role Implementor のフック関数
                    Role ConcreteImplementor で実装される
                    呼んでいる関数名となんか似たような名前にするべき
                    だとは思う…
    
    Abstraction::Operation() {
      "imp" . "OperationImp" ( )
    }
    
  3. Composite
    "g": 集約の要素ひとつを取り出して置いておくための変数
    "children": Role Component への aggregate (集約) のラベル
    "Operation": Role Component のフック関数
                 SubRole Leaf, Composite で実装される
                 呼んでいる関数名と同名 
    
    Composite::Operation() {
      for all "g" in "children"
        "g" . "Operation" ( )
    }
    
  4. Decorator
    "component": Role Component への aggregate (単数)のラベル
    "Operation": Role Component のフック関数
                 SubRole ConcreteComponent, Decorator, 更に
                 ConcreteDecorator で実装される
                 呼んでいる関数名と同名 
    
    Decorator::Operation() {
      "component" . "Operation" ( )
    }
    
    ConcreteDecorator::Operation() {
      "Decorator" :: "Operation" ( )
      "AddedBehaivior" ( )
    }
    
  5. Facade

    一切の疑似コードはなし

  6. Flyweight
    "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"
      }
    }
    
  7. Proxy
    "realSubject": Role RealSubject への参照のラベル
    "Request": Role RealSubject で定義される任意の関数
               名前はなんでもいい
    
    Proxy::Request() {
      ...
      "realSubject" . "Request"
      ...
    }
    

振舞いに関するパターン

  1. Chain of Resiponsibility

    図そのものにはない

    "successor": Role Handler への参照のラベル
    "HandleRequest": Role Handler のフック関数(半具象)
                     デフォルトの振舞をもつ
                     Role ConcreteHandler で実装される
    
    Handler::HandleRequest() {
      "successor" . "HandleRequest" ( )
    }
    
    ConcreteHandler::HandleRequest() {
      if can handle {
        "ResolveRequest" ( )
      } else {
        "Handler" :: "HandleRequest" ( )
      }
    }
    
    このあたりは保留….

  2. Command
    "receiver": Role Receiver への参照のラベル
    "Action": Role Receiver で定義される任意の関数
              名前はなんでもいい
    
    ConcreteCommand::Execute() {
      "receiver" . "Action" ( )
    }
    
  3. Interpreter

    特になし?

  4. Iterator
    "ConcreteIterator": Role 名
    
    ConcreteAggregate::CreateIterator() {
      return new "ConcreteIterator" ( this )
    }
    
    図には記述がない
    "target": ConcreteAggregate への参照のラベル(図にはない)
    "aggr": 引数
    
    ConcreteIterator::ConcreteIterator(ConcreteAggregate aggr) {
      "target" = "aggr"
    }
    
    
  5. Mediator

    特になし?

  6. Memento
    "state": メンバ変数
    "m": 引数
    "GetState": Role Memento で定義される関数
                この意味を維持した名前が良い
    
    Originator::SetMemento(Memento m) {
      "state" = "m" . "GetState" ( )
    }
    
    "Memento": Role 名
    "state": メンバ変数
    
    Originator::createMemento() {
      return new "Memento" ( "state" )
    }
    
    状態を入れておくクラスを補充した方が良さそう…
    state のクラス
    
  7. Observer
    "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"
    }
    
    これも状態を入れておくクラスを補充した方が良さそう…
  8. State
    "state": Role State への aggregate のラベル
    "Handle": Role State のフック関数
              Role ConcreteState で実装される
              名前は自由
    
    Context::Request() {
      "state" . "Handle" ( )
    }
    
  9. Strategy

    図には記述がない 余りに一般的すぎるパターン

    "strategy": Role Strategy への aggregate のラベル
    "AlgorithmInterface": Role Strategy のフック関数
                          Role ConcreteStrategy で実装される
                          名前は自由
    
    Context::ContextInterface() {
      "strategy" . "AlgorithmInterface" ( )
    }
    
  10. Templete Method これもとても一般的なパターン
    "PrimitiveOperation": Role AbstractClass のフック関数
                          Role ConcreteClass で実装される
                          名前は自由
    
    AbstractClass::TempleteMethod() {
    ...
    "PrimitiveOperation" ( )
    ...
    }
    
  11. Visitor
    "v": 引数
    "VisiteConcreteElement": Role Visitor のフック関数
                             Role ConcreteVisitor で実装される
                             Visit + Role 名 とすることが多い
    
    ConcreteElement::Accept(Visitor v) {
      "v" . "VisiteConcreteElement" ( this )
    }
    

Mika Ohtsuki <mika@db.is.kyushu-u.ac.jp>
Last modified: Mon Nov 4 12:02:09 1996