设计模式与二项式方法编程
立即解锁
发布时间: 2025-08-21 00:26:02 阅读量: 1 订阅数: 5 


C++ for Financial Engineers: An Object-Oriented Approach
# 设计模式与二项式方法编程
## 1. 简单数组类示例
首先来看一个简单数组类 `SimpleArray` 的实现,它实现了一维访问接口 `IOneDimensionalAccess<double>`。以下是代码示例:
```cpp
class SimpleArray : IOneDimensionalAccess<double> // Index == int
{
private:
double first;
double second;
public:
SimpleArray() { first = 1.0; second = 2.71;}
double& operator [] (int index)
{
if (1 == index) return first;
if (2 == index) return second;
}
};
int main()
{
SimpleArray myArr;
cout << myArr[1] << ", " << myArr[2] << endl;
return 0;
}
```
在这个示例中,`SimpleArray` 类包含两个私有成员变量 `first` 和 `second`,并通过重载 `[]` 运算符来实现对这两个元素的访问。在 `main` 函数中,我们创建了一个 `SimpleArray` 对象 `myArr`,并输出了其两个元素的值。
## 2. 设计模式概述
设计模式可以分为三大类,每一类中的具体模式都有助于开发者创建灵活的 C++ 类。
### 2.1 创建型模式
创建型模式用于以灵活的方式创建对象,常见的创建型模式有:
- **工厂方法**:定义一个创建对象的接口,让子类决定实例化哪个类。
- **抽象工厂**:提供一个创建相关或依赖对象家族的接口,而无需指定它们的具体类。
- **原型**:通过克隆或复制另一个“原型”对象来创建对象。
- **单例**:确保一个类只有一个实例,并提供一个全局访问点。
下面以抽象工厂创建单因子期权对象为例进行说明。首先定义基本的期权类:
```cpp
class Instrument
{
public:
};
class Option : public Instrument
{
public:
// PUBLIC, PURE FOR PEDAGOGICAL REASONS
double r; // Interest rate
double sig; // Volatility
double K; // Strike price
double T; // Expiry date
double b; // Cost of carry
double SMax; // Far field condition
char type; // Call or put
Option(){}
// An option uses a polymorphic payoff object
OneFactorPayoff OptionPayoff;
};
```
然后定义抽象工厂的基类接口:
```cpp
class InstrumentFactory
{
public:
virtual Option* CreateOption() const = 0;
};
```
接着定义一个具体的工厂类 `ConsoleInstrumentFactory`,它根据控制台输入创建期权对象:
```cpp
class ConsoleInstrumentFactory : public InstrumentFactory
{
public:
Option* CreateOption() const
{
double dr; // Interest rate
double dsig; // Volatility
double dK; // Strike price
double dT; // Expiry date
double db; // Cost of carry
double dSMax; // Far field boundary
cout << "Interest rate: ";
cin >> dr;
cout << "Volatility: ";
cin >> dsig;
cout << "Strike Price: ";
cin >> dK;
dSMax = 4.0 * dK; // Magix Number !!!!
cout << "Expiry: ";
cin >> dT;
// Should ask what kind of option (as in Haug, 1998)
cout << "Cost of carry: ";
cin >> db;
Option* result = new Option;
cout << "Payoff 1) Call, 2) Put: ";
int ans;
cin >> ans;
if (ans == 1)
{
result-> type = "C";
(*result).OptionPayoff = OneFactorPayoff(dK, MyCallPayoffFN);
}
else
{
result-> type = "P";
(*result).OptionPayoff = OneFactorPayoff(dK, MyPutPayoffFN);
}
result->r = dr;
result->sig = dsig;
result->K = dK;
result->T = dT;
result->b = db;
result->SMax = dSMax;
return result;
}
};
```
为了实现信息隐藏,我们定义一个函数返回抽象工厂的指针:
```cpp
InstrumentFactory* GetInstrumentFactory()
{
return new ConsoleInstrumentFactory;
// Later other specific concrete factories
}
```
在客户端程序中使用这个工厂:
```cpp
int main()
{
InstrumentFactory* myFactory = GetInstrumentFactory();
Option* myOption = myFactory ->CreateOption();
// Further processing with option
return 0;
}
```
### 2.2 结构型模式
结构型模式用于将对象组合成更大的结构,常见的结构型模式有:
- **适配器**:将一个类的接口转换为客户端期望的接口。例如,将 `list<T>` 类的接口适配为定义 `stack<T>` 类。
- **组合**:将对象组合成树状结构和递归聚合。
- **桥接**:将一个类与其实现解耦,使两者可以独立变化。
- **外观**:为一组接口提供一个统一的接口。
### 2.3 行为型模式
行为型模式主要涉及类的成员函数,可分为以下三个子类别:
- **变体模式**:以不同的方式执行相同的任务。例如,策略模式(灵活的算法)、命令模式(将请求封装为对象)和模板方法模式(定义一个包含可变和不变部分的算法)。
- **扩展模式**:在不破坏类的源代码的情况下为类添加新功能。访问者模式是这个类别中唯一的模式。
- **通知模式**:确保对象网络中的数据保持一致。例如,观察者模式和中介者模式。
## 3. 选择合适的设计模式
在选择设计模式时,需要考虑其在特定上下文中的实用性以及实现所需的工作量。可以使用以下矩阵来评估设计模式:
| | 功能 | 效率 | 可维护性 | 可移植性 |
| --- | --- | --- | --- | --- |
| 工厂方法 | | | | |
| 抽象工厂 | | | | |
| 桥接 | | | | |
| 组合 | | | | |
| 适配器 | | | | |
| 属性模式 | | | | |
| 访问者 | | | | |
| 策略 | | | | |
| 观察者 | | | | |
矩阵中符号的含义如下:
- *
0
0
复制全文
相关推荐










