C++设计模式[3]

[入库:2005年8月19日] [更新:2007年3月24日]

本文简介:选择自 csenior 的 blog



c++模式开发之bridge
2002-07-29· · ··com集中营

  一、功能
  将抽象部分与它的实现部分分离,使它们都可以独立地变化。

  二、结构图

  三、示例代码

namespace designpattern_bridge
{
// class implementor
class implementor
{
public:
virtual void operationimp() = 0 ;
} ;

// class concreteimplementora
class concreteimplementora : public implementor
{
public:
virtual void operationimp() {}
} ;

// class concreteimplementorb
class concreteimplementorb : public implementor
{
public:
virtual void operationimp() {}
} ;

// class abstraction
class abstraction
{
public:
void operation(implementor* imp) { assert(imp) ; imp->operationimp() ; }
} ;
}

客户端代码:
{
using namespace designpattern_bridge ;

abstraction obj ;
implementor *impa = new concreteimplementora() ;
implementor *impb = new concreteimplementorb() ;
obj.operation(impa) ; //第一种实现方法
obj.operation(impb) ; //第二种实现方法
}

  四、实例

  (1)创建可以在x window system和ibm的presentation manager系统中都可以使用的窗口。(书上的例子)

  bridge的魅力在于抽象和实现之间是松散的关系,它们之间可以进行随意组合。如上图中,就有iconwindow+xwindowimp、transientwindow+xwindowimp、iconwindow+pmwindowimp、transientwindow+pmwindowimp四种组合。



c++模式设计之builder
2002-07-30· · ··com集中营

  一、功能

  将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

  二、结构图


  各类之间的交互关系如下图所示:


  三、示例代码

namespace designpattern_builder
{
class product1 { /*...*/ } ;
class product2 { /*...*/ } ;

// class builder
class builder //抽象基类
{
public:
virtual void builderparta() {} //提供缺省实现
virtual void builderpartb() {}
virtual void builderpartc() {}
protected:
builder() {}
} ;

// class concretebuilder1
class concretebuilder1 : public builder //创建product1
{
public:
concretebuilder1() : _product(null) {}

virtual void builderparta() { /*...*/ }
virtual void builderpartb() { /*...*/ }
virtual void builderpartc() { /*...*/ }

virtual product1* getproduct1() { return _product ; } //返回创建的product1对象
private:
product1 *_product ;
} ;

// class concretebuilder2
class concretebuilder2 : public builder //创建product2
{
public:
concretebuilder2() : _product(null) {}

virtual void builderparta() { /*...*/ }
virtual void builderpartb() { /*...*/ }
virtual void builderpartc() { /*...*/ }

virtual product2* getproduct2() { return _product ; } //返回创建的product2对象
private:
product2 *_product ;
} ;

// class director
class director
{
public:
//创建对象(director并不知道具体创建出来的对象是什么样的,只有调用该函数的client知道)
void construct(builder *builder)
{
builder->builderparta() ;
builder->builderpartb() ;
builder->builderpartc() ;
}
} ;
}

客户端代码:
{
using namespace designpattern_builder ;

director director ;

// 创建第一种对象
concretebuilder1 *pbuilder1 = new concretebuilder1() ;
director.construct(pbuilder1) ;
product1 *product1 = pbuilder1->getproduct1() ;

// 创建第二种对象
concretebuilder2 *pbuilder2 = new concretebuilder2() ;
director.construct(pbuilder2) ;
product2 *product2 = pbuilder2->getproduct2() ;
}

  四、实例

  (1)例子一。如下图所示:


  上图的功能是是把一个rtf文件转换为多种正文格式。rtfreader进行语法分析,然后将所有的token串逐一转换。可见builder就是一步步地把各个部分组装为一个整体。它封闭了组装的方法,组装出来的对象也大相径庭。



c++设计模式之prototype
2002-08-01· · ··com集中营

  一、功能

  用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。



  二、结构图

  三、优缺点

  优点:复制自身。客户不知道需要对象的实际类型,只需知道它的抽象基类即可。(即有继承树的情况)

  缺点:必须先有一个对象实例(即原型)才能clone。

  四、示例代码

namespace designpattern_prototype
{
// class prototype
class prototype //抽象基类
{
public:
virtual prototype* clone() = 0 ;
} ;

// class concreteprototype1
class concreteprototype1 : public prototype
{
public:
virtual prototype* clone()
{
concreteprototype1 *p = new concreteprototype1() ;
*p = *this ; //复制对象
return p ;
}
} ;

// class concreteprototype2
class concreteprototype2 : public prototype
{
public:
virtual prototype* clone()
{
concreteprototype2 *p = new concreteprototype2() ;
*p = *this ; //复制对象
return p ;
}
} ;
}

客户端代码:
{
using namespace designpattern_prototype ;

concreteprototype1 *obj1 = new concreteprototype1() ;//原型对象1
concreteprototype2 *obj2 = new concreteprototype2() ;//原型对象2

prototype *newobj1 = obj1->clone() ;//克隆对象1
prototype *newobj2 = obj2->clone() ;//克隆对象2

//使用复制出的对象newobj1和newobj2
}

  五、实例

     在一个图形编辑器中,每一个图形元素,如线、圆、文字等都应该支持拷贝操作,即点中图形,按下ctrl+c,再按下ctrl+v后就会复制一个新的图形。显然这是一种clone操作。所以在每个从graphic派生出的图形子类都应运用prototype模式,加上clone操作。


c++设计模式之factory method
2002-08-05· · ··com集中营

  一、功能

  定义一个用于创建对象的接口,让子类决定实例化哪一个类。factory method 使一个类的实例化延迟到其子类。

  二、结构图

  三、实现

(1)在某些情况下,比如仅仅为了创建适当的product对象而派生新的creator子类,并且创建不同product的方法一致时,可以考虑用模板代替继承。如:

class creator
{
public:
virtual product* createproduct() = 0 ;
};

template < class concreteproduct >
class concretecreator: public creator
{
public:
virtual product* createproduct() { return new concreteproduct() ; }
};

本文关键:C++设计模式
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top