独習デザインパターンC++ 電子書籍(長瀬 嘉秀 株式会社テクノロジックアート)|翔泳社の本
  1. ホーム >
  2. 電子書籍 >
  3. 独習デザインパターンC++

独習デザインパターンC++

監修

形式:
電子書籍
発売日:
ISBN:
9784798142463
価格:
3,740(本体3,400円+税10%)
カテゴリ:
プログラミング・開発
キーワード:
#プログラミング,#開発環境,#開発手法,#Web・アプリ開発
シリーズ:
独習
電子書籍

実践的なプログラミング技法の基礎から実装まで!

デザインパターンを「使うことができる」ためには、デザインパターンの構造や仕組みを知っているだけでは充分ではありません。「どのような状況」で「どんなふう」に使うのが効果的なのかを充分に理解している必要があります。そこで本書では、パターンの使いどころと効果をわかりやすく示すことで、どのようなときにどんなふうにデザインパターンを使えばよいのかを理解できるようにしています。

第1部 オブジェクト指向とデザインパターン

第1章 オブジェクト指向とUML
1.1 オブジェクト指向の概要
1.2 クラスとインスタンス
1.3 継承と汎化
1.4 カプセル化
1.5 インターフェース
1.6 抽象クラス
1.7 多態性・多様性
1.8 集約
1.9 メッセージ送信
まとめ
理解度チェック

第2章 デザインパターンとは
2.1 パターンとは
2.2 デザインパターンの概要
理解度チェック

第2部 使用頻度が高いパターン

第3章 シングルトン(Singleton)
3.1 目的
3.2 適用動機
3.3 パターン未適用
3.4 パターン適用
3.5 メリット
3.6 発展
3.7 構造と構成要素
3.8 考慮事項
理解度チェック

第4章 ファクトリメソッド(Factory Method)
4.1 目的
4.2 適用動機
4.3 パターン未適用
4.4 パターン適用
4.5 メリット
4.6 発展 1
4.7 発展 2
4.8 構造と構成要素
4.9 その他
理解度チェック

第5章 アブストラクトファクトリ(Abstract Factory)
5.1 目的
5.2 適用動機
5.3 パターン未適用
5.4 パターン適用
5.5 メリット
5.6 構造と構成要素
5.7 考慮事項
理解度チェック

第6章 テンプレートメソッド(Template Method)
6.1 目的
6.2 適用動機
6.3 パターン未適用
6.4 パターン適用
6.5 メリット
6.6 拡張
6.7 構造と構成要素
6.8 考慮事項
6.9 その他
理解度チェック

第7章 イテレータ(Iterator)
7.1 目的
7.2 適用動機
7.3 パターン未適用
7.4 パターン適用
7.5 メリット
7.6 構造と構成要素
7.7 考慮事項
理解度チェック

第2部の復習問題

第3部 使用頻度が中程度のパターン

第8章 コンポジット(Composite)
8.1 目的
8.2 適用動機
8.3 パターン未適用
8.4 パターン適用
8.5 メリット
8.6 拡張
8.7 構造と構成要素
8.8 考慮事項
理解度チェック

第9章 アダプター(Adapter)
9.1 目的
9.2 適用動機
9.3 パターン未適用
9.4 パターン適用
9.5 メリット
9.6 構造と構成要素
9.7 考慮事項
理解度チェック

第10章 コマンド(Command)
10.1 目的
10.2 適用動機
10.3 パターン未適用
10.4 パターン適用
10.5 メリット
10.6 構造と構成要素
10.7 考慮事項
10.8 その他
理解度チェック

第11章 ファサード(Facade)
11.1 目的
11.2 適用動機
11.3 パターン未適用
11.4 パターン適用
11.5 メリット
11.6 構造と構成要素
11.7 考慮事項
理解度チェック

第12章 ステート(State)
12.1 目的
12.2 適用動機
12.3 パターン未適用
12.4 パターン適用
12.5 メリット
12.6 構造と構成要素
12.7 考慮事項
12.8 その他
理解度チェック

第13章 オブザーバー(Observer)
13.1 目的
13.2 適用動機
13.3 パターン未適用
13.4 パターン適用
13.5 メリット
13.6 発展
13.7 構造と構成要素
13.8 考慮事項
理解度チェック

第14章 ストラテジー(Strategy)
14.1 目的
14.2 適用動機
14.3 パターン未適用
14.4 パターン適用
14.5 メリット
14.6 構造と構成要素
14.7 考慮事項
14.8 その他
理解度チェック

第15章 プロキシー(Proxy)
15.1 目的
15.2 適用動機
15.3 パターン未適用
15.4 パターン適用
15.5 メリット
15.6 拡張
15.7 構造を構成要素
15.8 考慮事項
15.9 その他
理解度チェック

第3部の復習問題

第4部 使用頻度が低いパターン

第16章 ビルダー(Builder)
16.1 目的
16.2 適用動機
16.3 パターン未適用
16.4 パターン適用
16.5 メリット
16.6 構造と構成要素
16.7 考慮事項
16.8 その他
理解度チェック

第17章 ブリッジ(Bridge)
17.1 目的
17.2 適用動機
17.3 パターン未適用
17.4 パターン適用
17.5 メリット
17.6 構造と構成要素
17.7 考慮事項
理解度チェック

第18章 メディエータ(Mediator)
18.1 目的
18.2 適用動機
18.3 パターン未適用
18.4 パターン適用
18.5 メリット
18.6 拡張
18.7 構造と構成要素
18.8 その他
理解度チェック

第19章 チェーンオブレスポンシビリティ(Chain of Responsibility)
19.1 目的
19.2 適用動機
19.3 パターン未適用
19.4 パターン適用
19.5 メリット
19.6 構造と構成要素
19.7 考慮事項
19.8 その他
理解度チェック

第20章 デコレータ(Decorator)
20.1 目的
20.2 適用動機
20.3 パターン未適用
20.4 パターン適用
20.5 発展
20.6 メリット
20.7 拡張
20.8 構造と構成要素
20.9 考慮事項
20.10 その他
理解度チェック

第21章 ビジター(Visitor)
21.1 目的
21.2 適用動機
21.3 パターン未適用
21.4 パターン適用
21.5 メリット
21.6 拡張
21.7 構造と構成要素
21.8 考慮事項
21.9 その他
理解度チェック

第22章 プロトタイプ(Prototype)
22.1 目的
22.2 適用動機
22.3 パターン未適用
22.4 パターン適用
22.5 メリット
22.6 拡張
22.7 構造と構成要素
22.8 考慮事項
22.9 その他
理解度チェック

第23章 フライウェイト(Flyweight)
23.1 目的
23.2 適用動機
23.3 パターン未適用
23.4 パターン適用
23.5 メリット
23.6 拡張
23.7 構造と構成要素
理解度チェック

第24章 メメント(Memento)
24.1 目的
24.2 適用動機
24.3 パターン未適用
24.4 パターン適用
24.5 メリット
24.6 構造と構成要素
24.7 考慮事項
24.8 その他
理解度チェック

第25章 インタープリタ(Interpreter)
25.1 目的
25.2 適用動機
25.3 パターン未適用
25.4 パターン適用
25.5 メリット
25.6 拡張
25.7 構造と構成要素
25.8 考慮事項
25.9 その他
理解度チェック

第4部の復習問題

付録 A 理解度チェックの解答

本書は付属データの提供はございません。

お問い合わせ

内容についてのお問い合わせは、正誤表、追加情報をご確認後に、お送りいただくようお願いいたします。

正誤表、追加情報に掲載されていない書籍内容へのお問い合わせや
その他書籍に関するお問い合わせは、書籍のお問い合わせフォームからお送りください。

利用許諾に関するお問い合わせ

本書の書影(表紙画像)をご利用になりたい場合は書影許諾申請フォームから申請をお願いいたします。
書影(表紙画像)以外のご利用については、こちらからお問い合わせください。

追加情報はありません。
この商品の「よくある質問」はありません。

ご購入いただいた書籍の種類を選択してください。

書籍の刷数を選択してください。

刷数は奥付(書籍の最終ページ)に記載されています。

現在表示されている正誤表の対象書籍

書籍の種類:

書籍の刷数:

本書に誤りまたは不十分な記述がありました。下記のとおり訂正し、お詫び申し上げます。

対象の書籍は正誤表がありません。

最終更新日:2015年07月24日
発生刷 ページ数 書籍改訂刷 電子書籍訂正 内容 登録日
1刷 028
下から3行目
2刷
「親クラスを抽象クラスにして共通のメンバ関数として実装しまおう」
「親クラスを抽象クラスにして共通のメンバ関数として実装してしまおう」
2009.06.15
1刷 045
下から3~2行目
2刷
この例では、初めてgetFileMap()を呼び出すときまで変数fileMapの初期化を行いません。getFileMap()が呼ばれなかった場合には、
この例では、初めてgetFileList()を呼び出すときまで変数fileListの初期化を行いません。getFileList()が呼ばれなかった場合には、
2009.03.13
1刷 050
下から2行目
2刷
Gof
GoF
2011.10.27
1刷 051
図2.4
2刷
図2.4

左上隅点線枠内に「ビジターパターン」を追加
2011.10.27
1刷 058
箇条書きの2項目目
2刷
2つ以上の
2つ以上の
2011.10.27
1刷 061
9行目
さらに、呼び出し側のクラス(関数)に唯一のPrintSpoolオブジェクトを
さらに、唯一のPrintSpoolオブジェクトを
2012.08.28
1刷 065
リスト3.8の20~22行目
    static PrintSpoolRev* getInstance(int idx) {
static map<int, PrintSpoolRev*> instances;

map<int, PrintSpoolRev*>::iterator it;
it = instances.find(idx);
if (it != instances.end()) return (*it).second;

PrintSpoolRev* tmpobj = new PrintSpoolRev(idx);
instances.insert(make_pair(idx, tmpobj));
return tmpobj;
}

    static PrintSpoolRev* getInstance(int idx) {
static map<int, PrintSpoolRev*> instances;

map<int, PrintSpoolRev*>::iterator it;
it = instances.find(idx);
if (it != instances.end()) return (*it).second;

PrintSpoolRev* tmpobj = new PrintSpoolRev(idx);
instances.insert(make_pair(idx, tmpobj));
return tmpobj;
}


字下げの位置を修正
2012.08.28
1刷 074
図4.2
2刷
+ create()
+ create()

DataObjectクラスのcreate()メソッドに下線を追加
2012.07.03
1刷 078
リスト4.6の2行上
2刷
オブジェクト生成の責任をDataObjectFactoryに負わせますので、DataObjectはリスト4.3の状態に戻します
オブジェクト生成の責任をDataObjectFactoryクラスに移すので、DataObjectクラスのcreate()メソッドは不要となり、リスト4.7となります
2008.12.26
1刷 079
リスト4.6の後ろ
2刷
リスト4.7 オブジェクト生成の責任を移した後のDataObjectクラス
【FactoryMethod.h】
class DataObject {
public:
virtual string getName(int id) = 0;
};

「リスト4.6」の後ろに「リスト4.7」を追加。以降、84ページまでリスト番号が1ずつずれます。
2008.12.26
1刷 082
リスト番号
2刷
リスト4.7 発展1後のファクトリメソッド リスト4.8 修正後のDataObjectFactoryクラス
リスト4.8 発展1後のファクトリメソッド リスト4.9 修正後のDataObjectFactoryクラス
2012.07.03
1刷 083
リスト番号
2刷
リスト4.9 DataObjectFactoryインターフェース リスト4.10 FileDataObjectFactoryクラス リスト4.11 DBDataObjectFactoryクラス
リスト4.10 DataObjectFactoryインターフェース リスト4.11 FileDataObjectFactoryクラス リスト4.12 DBDataObjectFactoryクラス
2012.07.03
1刷 084
リスト番号
2刷
リスト4.12 DefaultDataObjectFactoryインターフェース
リスト4.13 DefaultDataObjectFactoryインターフェース
2012.07.03
1刷 094
下から3行目
2刷
    virtual void makeBase() const {
cout << "バースデーケーキ用スポンジ作成" << endl;
}
    virtual void makeBase() const {
cout << "バースデーケーキ用スポンジ作成" << endl;
}

字下げの位置を修正
2011.10.27
1刷 095
リスト5.6の3~5行目
2刷
virtual CakeBase* CreateBase() = 0;
virtual Fruit* CreateFruit() = 0;
virtual Decoration* CreateDecoration() = 0;
virtual CakeBase* createBase() = 0;
virtual Fruit* createFruit() = 0;
virtual Decoration* createDecoration() = 0;
2008.12.24
1刷 096
下から5行目
デコレーションケーキすべてを入れられる
<削除>
2012.08.28
1刷 097
図5.1のDecorationクラス、BirthdayDecorationクラス、XmasDecorationクラスのメソッド
+ makeDecoration()
+ makeDecoration() + makeDecoration(name:string)
2012.08.28
1刷 098
図5.2
図5.2

<第1刷をお持ちの場合>
・AbstractFactoryクラスのメソッド
 誤:+ CreateProductA()  正:+ createProductA()
 誤:+ CreateProductB()  正:+ createProductB()
・ConcreteFactory1クラスおよびConcreteFactory2クラスのメソッド
 誤:+ CreateFactoryA()  正:+ createProductA()
 誤:+ CreateFactoryB()  正:+ createProductB()
・誤:AbstractProductA1  正:ConcreteProductA1
・誤:AbstractProductA2  正:ConcreteProductA2
・誤:AbstractProductB1  正:ConcreteProductB1
・誤:AbstractProductB2  正:ConcreteProductB2
<第2刷をお持ちの場合>
・誤:concreteProductA1  正:ConcreteProductA1
・誤:concreteProductA2  正:ConcreteProductA2
・誤:concreteProductB1  正:ConcreteProductB1
・誤:concreteProductB2  正:ConcreteProductB2
2012.07.05
1刷 105
リスト6.4の下から3行目
2刷
void writeFile(string outfilename, string modData) {
void writeToFile(string outfilename, string modData) {
2008.12.24
1刷 107、108
P107「リスト6.8」P108「リスト6.9」「リスト6.10」それぞれの下から2行目
2刷
string TabToCSVFormatter::writeToFile(string outfilename,
void TabToCSVFormatter::writeToFile(string outfilename,
2008.12.24
1刷 109
本文1行目
2刷
呼び出が
呼び出
2011.10.27
1刷 117
箇条書き1項目目と2項目目、リスト7.2の5行目と6行目
2刷
基盤
基板
2011.10.27
1刷 121
リスト7.7の5行目と6行目
2刷
基盤
基板
2011.10.27
1刷 121
リスト7.7の下から3行目
2刷
} delete pMachine;
} delete it;
delete pMachine;
2010.01.05
1刷 123
リスト7.8の3行目
2刷
基盤
基板
2011.10.27
1刷 145
7行目
writeString()をオーバーライドする
writeString()をオーバーロードする
2012.08.28
1刷 156、160
P.156の最初のコードの中ほど、P.160のコードの後半
2刷
history.erase(it, history.end());
while (it != history.end()) {
history.erase(it);
delete (*it++);
}
2009.03.11
1刷 161
リスト10.4の最後に追加
Point* Command::getPoint(){
return point;
}

CommandクラスにCommand::getPointを追加
2012.08.28
1刷 163
図10.3のMoveCommandクラスとLineCommandクラスのメソッド(2か所)
2刷
+ undo
+ undo()
2012.07.04
1刷 172、174
P.172の図11.1、P.174の図11.2
2刷
(Televisionクラスのメソッド)  + tvOff (Bathクラスのメソッド)  + switchOff
(Televisionクラスのメソッド)  + tvOff()
(Bathクラスのメソッド)  + switchOff()
2012.07.04
1刷 178
最下行
2刷
pEBox->state->showCurrentState();
<削除>
2008.12.25
1刷 178
箇条書き1項目目
2刷
Idel
Idle
2011.10.27
1刷 179
リスト12.2の【State.h】
2刷
class EngineBox {
public:
void up();
void down();
class EngineBox {
public:
EngineBox();
void up();
void down();
2008.12.25
1刷 186
図12.3 右下のクラス名
ConcreteSateA ConcreteSateB
ConcreteStateA ConcreteStateB
2012.07.27
1刷 197
図13.8

「7:新しい色情報を取得する()」の矢印の起点を「色表現」に修正
2012.11.13
1刷 216
表15.1のフィールド名
2刷
sales_date
saleDate
2012.07.04
1刷 216
表15.2のフィールド名
2刷
unit_price
unitPrice
2012.07.04
1刷 220
図15.2
2刷
図15.2

・「SetData」クラスを「SaleData」クラスに訂正
・SaleDataクラスのsetDate()とgetId()の間にあった罫線を削除
2011.10.27
1刷 228
図15.4
2刷
図15.4

・3本の実線を破線に訂正
・「Subject」の上に「«interface»」のステレオタイプを追加
・「Subject」「+ request()」を斜体から正体に訂正
2011.10.27
1刷 239
リスト16.8の9行目
pDirector->constract(pBuilder);
pDirector->construct(pBuilder);
2012.08.28
1刷 240
図16.1のHomeBuilderインタフェース、ModernHomeBuilderクラス、EuropeanHomeBuilderクラス、JapaneseHomeBuilderクラスのメソッド名
+getStructure()
+setStructure()
2012.08.28
1刷 245
リスト17.3 下から3行目
virtual void writeFile(string& str);
virtual void writeString(string& str);
2015.07.24
1刷 257
箇条書き1項目目
2刷
getSelectedItem()メソッド
getMonth()メソッド
2011.10.27
1刷 265
図18.4
2刷
図18.4

・MediatorとColleagueの間にある矢印を逆向きに訂正
・ConcretemediatorとConcreteColleagueAおよびBの矢印について、向きを逆にし、線の片端にある白抜きのひし形を削除
2011.10.27
1刷 272
図19.1
2刷
図19.1

LightLuggageDeliveryクラス、mediumLuggageDeliveryクラス、およびHeavyLuggageDeliveryクラスのメソッドを次のとおり訂正
誤  + checkLuggage()
+ deliver
正 + checkLuggage(luggage:Luggage)
+ deliver(luggage:Luggage)

2012.07.04
1刷 275
図19.2

<第1刷をお持ちの場合>
・Deliveryクラスの属性
誤:-successor_
正:-pSuccessor
・Deliveryクラスのメソッド
誤:+ checkLuggage()
+ deliver()
+ handle()
+ getAcceptance()
正:+ checkLuggage(pLuggage:Luggage)
+ deliver(pLuggage:Luggage)
+ handle(pLuggage:Luggage)
# getAcceptance(pLuggage:Luggage)
・LightLuggageDeliveryクラス、mediumLuggageDeliveryクラスおよびHeavyLuggageDeliveryクラスのメソッド
誤:+ checkLuggage()
+ deliver
正:+ checkLuggage(pLuggage:Luggage)
+ deliver(pLuggage:Luggage)
+ handle(pLuggage:Luggage)
<第2刷をお持ちの場合>
・Deliveryクラスの属性
誤:-successor_
正:-pSuccessor
・Deliveryクラスのメソッド
誤:+ checkLuggage(luggage:Luggage)
+ deliver()
+ handle(luggage:Luggage)
+ getAcceptance()
正:+ checkLuggage(pLuggage:Luggage)
+ deliver(pLuggage:Luggage)
+ handle(pLuggage:Luggage)
# getAcceptance(pLuggage:Luggage)
・LightLuggageDeliveryクラス、mediumLuggageDeliveryクラスおよびHeavyLuggageDeliveryクラスのメソッド
誤:+ checkLuggage(luggage:Luggage)
+ deliver()
+ handle(luggage:Luggage)
正:+ checkLuggage(pLuggage:Luggage)
+ deliver(pLuggage:Luggage)
+ handle(pLuggage:Luggage)
2011.10.27
1刷 276
図19.3のHandlerクラス
図19.3

Handlerに属性の枠を追加し、線に「successor」を付加
2012.08.28
1刷 290
7行目
pBrWriter->write("localFile¥n");
pBrWriter->writeData("localFile¥n");
2012.08.28
1刷 291
6行目
pDbWriter->write("localFile¥n");
pDbWriter->writeData("localFile¥n");
2012.08.28
1刷 291
リスト20.9の5行目
virtual writeData(string str);
virtual void writeData(string str);
2012.08.28
1刷 291
リスト20.9【Decorator.cpp】
AbstractDecoratorWriter::CAbstractDecoratorWriter(Writer* pOut) {
this->pOut = pOut;
}
AbstractDecoratorWriter::writeData(string str) {
pOut->write(str);
}
AbstractDecoratorWriter::AbstractDecoratorWriter(Writer* pOut) {
this->pOut = pOut;
}
void AbstractDecoratorWriter::writeData(string str) {
pOut->writeData(str);
}
2012.08.28
1刷 293
図20.8の一番下のコメント
component::operation();
Decorator::operation();
2012.08.28
1刷 293
図20.8
修正後

以下は第2刷で訂正済みです
・ConcreteComponentとDecoratorクラスからComponentクラスへの矢印線を実線から破線に訂正
・「Component」の上に「«interface»」のステレオタイプを追加
・「Component」「operation()」を斜体から正体に訂正
以下は第2刷で未訂正、電子版で訂正済みです
・一番下のボックスを、「component::operation();」から「Decorator::operation();」に訂正
2011.10.27
1刷 299
リスト21.1の5~6行目
void add(Node* pNode) = 0; vector<Node*> find(string name);
virtual void add(Node* pNode) = 0; virtual list<Node*> find(string name);
2012.08.28
1刷 299
リスト21.1の下から7~3行目
list<Node*>& Node::find(string name) {
list<Node*>* pResult = new list<Node*>;
if (this->getName().compare(name)) pResult->push_back(this);
return* pResult;
}
list<Node*>* Node::find(string name) {
list<Node*>* pResult = new list<Node*>;
if (this->getName().compare(name) == 0) pResult->push_back(this);
return pResult;
}
2012.08.28
1刷 300
リスト21.2の5行目
virtual ~File();
<削除>
2012.08.28
1刷 300
リスト21.3の5行目
virtual ~Directory();
<削除>
2012.08.28
1刷 300
リスト21.3の下から4行目
list<Node*>* pResult = new list<Node*>;
list<Node*>* pResult = Node::find(name);
2012.08.28
1刷 301
1~8行目(リスト21.3)
        if(temp->size() != 0 ) {
pResult->merge(*temp);
delete temp;
}
it++;
}
return result;
}
        if(temp->size() != 0 ) {
pResult->merge(*temp);
}
delete temp;
it++;
}
return pResult;
}
2012.08.28
1刷 304
コードの下1行目
 visit()メソッドでは、検索対象のディレクトリ(またはファイル)か否かを判断して、
 visit()メソッドでは、検索対象のディレクトリまたはファイルの名前が指定されたものかを判断して、
2012.08.28
1刷 305
図21.2

以下のとおり、修正します。
・ライフライン
 誤:directory:Node 正:pDirectory:Node
 誤:file:Node 正:pFile:Node
・メッセージ
 誤:1:find(node,name) 正:1:find(pNode,name)
 誤:2:accept(visitor) 正:2:accept(pVisitor)
 誤:3:visit(directory) 正:3:visit(pDirectory)
 誤:5:accept(visitor) 正:5:accept(pVisitor)
 誤:6:visit(file) 正:6:visit(pFile)
2012.08.28
1刷 306
図21.3のListVisitorクラスのメソッド
+ find(name : String) : String
+ list(pNode : Node*) : String
2012.08.28
1刷 318
「22.6 拡張」の5~6行目
その場合は、オブジェクトのコピーを司る工場の役割を果たすクラスが必要になります。
<削除>
2012.08.28
1刷 320
リスト22.8の13~16行目
public:
A* pA;
protected:
virtual Cloneable* clone();
public:
A* pA;
virtual Cloneable* clone();

clone()メソッドの可視性を修正
2012.08.28
1刷 330
リスト23.7の6行目
class BillCoinFactory {
public:
BillCoinFactory();
class BillCoinFactory {
public:
BillCoinFactory();

public:の字下げの位置を修正
2012.08.28
1刷 330
リスト23.7【Flyweight.cpp】の1行目
map<int, BillCoin*> BillCoinFactory::coins;
<削除>
2012.08.28
1刷 342
リスト24.1の下から14行目
CCell* pCell = (*it);
Cell* pCell = (*it);
2012.08.28
1刷 343
(リスト24.1)12行目
list<list<CCell*>*>::iterator itCells = stack.begin();
list<list<Cell*>*>::iterator itCells = stack.begin();
2012.08.28
1刷 343
(リスト24.1)16行目
list<Cell*>::iterator itCell = (*it)->begin();
list<Cell*>::iterator itCell = (*itCells)->begin();
2012.08.28
1刷 346
【Memento.cpp】の8行目
delete stack;
<削除>
2012.08.28
1刷 347
2行目~(リスト24.3)
void SheetWithMemento::undo() {
if (current < 0) return;
list<CCellMemento*>::iterator it = stack.begin();
for (int i = 0;it != stack.end(); it++, i++) {
if (current == i) break;
}
CellMemento* memento = (*it);
cellList.remove(memento->getNewCell());
if (memento->getOldCell() != NULL)
cellList.push_back(memento->getOldCell());
if (current >= 0) current--;
}
void SheetWithMemento::undo() {
if (current < 0) return;
list<CellMemento*>::iterator it = stack.begin();
for (int i = 0; it != stack.end(); it++, i++) {
if (current == i) break;
}
CellMemento* pMemento = (*it);
cellList.remove(pMemento->getNewCell());
if (pMemento->getOldCell() != NULL)
cellList.push_back(pMemento->getOldCell());
current--;
2012.08.28
1刷 348
リスト24.4の下から2~1行目
Cell* CCellMemento::getNewCell() { return pNewCell; } Cell* CCellMemento::getOldCell() { return pOldCell; }
Cell* CellMemento::getNewCell() { return pNewCell; } Cell* CellMemento::getOldCell() { return pOldCell; }
2012.08.28
1刷 350
図24.4
図24.4

・コメントがどのメソッドに対するものかを明示
・OriginatorからMementoへの線に«create»を付加
2012.08.28
1刷 350
図24.4、MementoクラスとCaretakerクラスの間
2刷
memento
<削除>
2011.10.27
1刷 354
25.2の2行目~5行目
2刷
指定席は売切れの場合は購入できません。指定席がなければ自由席を購入する客がほとんどでですが、指定席がなければ自由席は購入しない客もいます。また、自由席の方をあえて好む客もいます。指定席が入手可能な状況と入手不可能な状況で、客が入手できる切符はどのように変化するでしょうか。
指定席は売切れの場合は購入できません。指定席がなければ自由席を購入する客がほとんどですが、購入しない客もいます。また、指定席より自由席を好む客もいます。指定席が入手可能な状況と入手不可能な状況で、客が入手する切符はどのように変化するでしょうか。
2011.10.27
1刷 356
(リスト25.2)最後の3つのコンストラクタ呼び出しの引数
Policy* Policy::preferReservedSeat() {
return new Policy(PREFER_RESERVED SEAT);
}
Policy* Policy::necessaryReservedSeat() {
return new Policy(NECESSARY_RESERVED SEAT);
}
Policy* Policy::preferUnreservedSeat() {
return new Policy(PREFER_UNRESERVED SEAT);
}
Policy* Policy::preferReservedSeat() {
return new Policy(PREFER_RESERVED_SEAT);
}
Policy* Policy::necessaryReservedSeat() {
return new Policy(NECESSARY_RESERVED_SEAT);
}
Policy* Policy::preferUnreservedSeat() {
return new Policy(PREFER_UNRESERVED_SEAT);
}

引数中のスペースをアンダーバーに修正(3か所)
2012.08.28
1刷 362
リスト25.9【Interpreter.cpp】の1~8行目
ConditionPolicy::ConditionPolicy(
TimeCondition* pCondition,
AbstractPolicy* pBodyPolicy,
AbstractPolicy* pElsePolicy) {

this->pCondition = pCondition;
this->pBodyPolicy = pBodyPolicy;
this->pElsePolicy = pElsePpolicy;
}
ConditionPolicy::ConditionPolicy(TimeCondition* pCondition,
AbstractPolicy* pBodyPolicy,
AbstractPolicy* pElsePolicy) {

this->pCondition = pCondition;
this->pBodyPolicy = pBodyPolicy;
this->pElsePolicy = pElsePolicy;
}

・字下げの位置を修正
・「pElsePpolicy」を「pElsePolicy」に修正
2012.08.28
1刷 363
図25.3
図25.3

AbstractPolicyとConditionalPolicyの間に汎化の線(白抜き矢印)を追加
2012.08.28
1刷 363
図25.3 下段のクラス名
2刷
PreferReservedPolicy NecessaryReservedPolicy PreferNonReservedPolicy
PreferReservedSeatPolicy NecessaryReservedSeatPolicy PreferNonReservedSeatPolicy
2012.07.04
1刷 364
3つ目の小見出し
2刷
NonterminalExpressionクラス
NonTerminalExpressionクラス
2011.10.27
1刷 388
第19章 3.の【答】
2刷
Sucssesorリンク。
sucsessorリンク。
2011.10.27
2刷 156
10~11行目
it += current + 1; it += current + 1;
it += current + 1;
2012.07.05

感想・レビュー

真(まこと) さん

2013-01-11

有名なGoFのデザインパターンについて解説した本です。オブジェクト指向系の技術書はJavaなどのサンプルを用いることが多い中、C++のサンプルで解説してくれている貴重な本だと思います。(やはり普段使っている言語の方が読みやすいです。)C++とオブジェクト指向についてある程度知識がある人向けです。UML図も使用されていますが、UMLはわからなくても、サンプルソースと解説で、各クラスの関係性がわかるので問題ないです。デザインパターン適用前と適用後のサンプルソースがあり、比較することで適用するメリットがとてもわ

Yoshi さん

2010-10-10

4.0

knoota さん

2017-07-09

GOF本を噛み砕き、サンプルコードつきで解説している本。GOF本では難易度が高いと感じたため、こちらを参考にした。C++が読めればデザインパターンの良い入門書と感じた。