模式设计学习(2)

开始学习下结构型模式。

先来看看Bridge模式和Adapter模式。这两种模式乍一看好像从结构图和代码实现上都不同,但我觉得,它们也共同的地方就是分层的思想。

首先是Bridge模式:该模式的精髓在于将抽象和实现分别独立实现,在下图中就是Abstraction类和AbstractionImp类。Abstraction相当于上层模块(对象),对外暴露一定的接口,而AbstractionImp相当于下层,由上层来调用,目的是实现上层的功能。

 

模式设计学习(2)_第1张图片

我们再看看Adapter模式。该模式有两种实现方式,一种是类模式,另一种是对象模式。分别如下图:

模式设计学习(2)_第2张图片

模式设计学习(2)_第3张图片

 

很容易从这两张图看出来这个模式的意图:就是接口转换。将Adaptee(老的对象)提供的SpecificRequest接口重现包装下,用Target的新接口Requst来向外提供。这无疑也是个分层的精神,Target对象(类)就是上层,Adaptee对象(类)是下层。上层直接调用了下层来实现某接口。

      我们一般需要给现有的类扩充功能(添加新的职责)时,可以用什么方法呢?首先,可以直接给该类添加成员函数,这样最直接的方法往往风险也是最大的,可能会牵动其他很多地方的修改;其次通常的做法可以使用派生一个子类的方法,这样的好处是不会影响到现有的代码,但可能导致继承深度变深,代码比较难读懂。第三就是通过Decorator模式,使用组合而非继承来给现有类增加新的职责。urml图如下:

模式设计学习(2)_第4张图片

 

我们再学习下Proxy模式,这种模式也是将接口(逻辑)和实现分开的一种典型模式。

模式设计学习(2)_第5张图片

 

可以看到,最终是由proxy来完成和用户的交互,Proxy类对象来操纵了Subject实际对象。Proxy模式提供对单个子类的实际地址的封装,接口完全与子类一样,便于对子类的管理和优化,尤其是对copy-on-write的优化方式,示例代码如下:

void Proxy::Request()
{
    // 需要使用ConcreteSubject的时候才去初始化
    if (NULL == m_pSubject)
    {
         std::cout << "Request By Proxyn";
     m_pSubject= new ConcreteSubject();
    }
    m_pSubject->Request();
}

 

 

你可能感兴趣的:(模式设计学习(2))