创建型模式 简单工厂模式(2)
实现数学运算 快速傅里叶变换

其中 Complex是实体类
using System;

namespace FFT
{
/// <summary>
/// Summary description for Complex.
/// </summary>
public class Complex
{
float real;
float imag;
//---------------------------------
public Complex(float r, float i) {
real = r;
imag = i;
}
//---------------------------------
public void setReal(float r) {
real = r;
}
//---------------------------------
public void setImag(float i) {
imag= i;
}
//---------------------------------
public float getReal() {
return real;
}
//---------------------------------
public float getImag() {
return imag;
}

}
}
Cocoon用来选择对那个类进行事例化
using System;

namespace FFT
{
/// <summary>
/// Summary description for Cocoon.
/// </summary>
public class Cocoon {
static public Butterfly getButterfly(float y) {
if (y != 0)
return new TrigButterfly(y);
else
return new addButterfly(y);
}
}
}
其中TrigButterfly和addButterfly都继承Butterfly
using System;

namespace FFT
{
/// <summary>
/// Summary description for TrigButterfly.
/// </summary>
public class TrigButterfly:Butterfly
{
float y;
float oldr1, oldi1;
float cosy, siny;
float r2cosy, r2siny, i2cosy, i2siny;
public TrigButterfly(float angle) {
y = angle;
cosy = (float) Math.Cos(y);
siny = (float)Math.Sin(y);
}
public override void Execute(Complex xi, Complex xj) {
oldr1 = xi.getReal();
oldi1 = xi.getImag();
r2cosy = xj.getReal() * cosy;
r2siny = xj.getReal() * siny;
i2cosy = xj.getImag()*cosy;
i2siny = xj.getImag()*siny;
xi.setReal(oldr1 + r2cosy +i2siny);
xi.setImag(oldi1 - r2siny +i2cosy);
xj.setReal(oldr1 - r2cosy - i2siny);
xj.setImag(oldi1 + r2siny - i2cosy);
}

}
}
using System;

namespace FFT
{
/// <summary>
/// Summary description for AddButterfly.
/// </summary>
class addButterfly : Butterfly
{
float oldr1, oldi1;

public addButterfly(float angle) {
}
public override void Execute(Complex xi, Complex xj) {
oldr1 = xi.getReal();
oldi1 = xi.getImag();
xi.setReal(oldr1 + xj.getReal());
xj.setReal(oldr1 - xj.getReal());
xi.setImag(oldi1 + xj.getImag());
xj.setImag(oldi1 - xj.getImag());
}
}

}
using System;

namespace FFT
{
/// <summary>
///Computes the complex multiplications for the FFT
/// </summary>
public abstract class Butterfly
{
float y;
public Butterfly() {
}
public Butterfly(float angle) {
y = angle;
}
abstract public void Execute(Complex x, Complex y);
}
}
其中Butterfly是抽象类,
abstract public void Execute(Complex x, Complex y);
是抽象方法

其中 Complex是实体类
using System;
namespace FFT
{
/// <summary>
/// Summary description for Complex.
/// </summary>
public class Complex
{
float real;
float imag;
//---------------------------------
public Complex(float r, float i) {
real = r;
imag = i;
}
//---------------------------------
public void setReal(float r) {
real = r;
}
//---------------------------------
public void setImag(float i) {
imag= i;
}
//---------------------------------
public float getReal() {
return real;
}
//---------------------------------
public float getImag() {
return imag;
}
}
}
Cocoon用来选择对那个类进行事例化
using System;
namespace FFT
{
/// <summary>
/// Summary description for Cocoon.
/// </summary>
public class Cocoon {
static public Butterfly getButterfly(float y) {
if (y != 0)
return new TrigButterfly(y);
else
return new addButterfly(y);
}
}
}
using System;
namespace FFT
{
/// <summary>
/// Summary description for TrigButterfly.
/// </summary>
public class TrigButterfly:Butterfly
{
float y;
float oldr1, oldi1;
float cosy, siny;
float r2cosy, r2siny, i2cosy, i2siny;
public TrigButterfly(float angle) {
y = angle;
cosy = (float) Math.Cos(y);
siny = (float)Math.Sin(y);
}
public override void Execute(Complex xi, Complex xj) {
oldr1 = xi.getReal();
oldi1 = xi.getImag();
r2cosy = xj.getReal() * cosy;
r2siny = xj.getReal() * siny;
i2cosy = xj.getImag()*cosy;
i2siny = xj.getImag()*siny;
xi.setReal(oldr1 + r2cosy +i2siny);
xi.setImag(oldi1 - r2siny +i2cosy);
xj.setReal(oldr1 - r2cosy - i2siny);
xj.setImag(oldi1 + r2siny - i2cosy);
}
}
}
using System;
namespace FFT
{
/// <summary>
/// Summary description for AddButterfly.
/// </summary>
class addButterfly : Butterfly
{
float oldr1, oldi1;
public addButterfly(float angle) {
}
public override void Execute(Complex xi, Complex xj) {
oldr1 = xi.getReal();
oldi1 = xi.getImag();
xi.setReal(oldr1 + xj.getReal());
xj.setReal(oldr1 - xj.getReal());
xi.setImag(oldi1 + xj.getImag());
xj.setImag(oldi1 - xj.getImag());
}
}
}
using System;
namespace FFT
{
/// <summary>
///Computes the complex multiplications for the FFT
/// </summary>
public abstract class Butterfly
{
float y;
public Butterfly() {
}
public Butterfly(float angle) {
y = angle;
}
abstract public void Execute(Complex x, Complex y);
}
}
其中Butterfly是抽象类,
abstract public void Execute(Complex x, Complex y);
是抽象方法


浙公网安备 33010602011771号