• 设计模式解析(五)——几种设计模式之Facade和Adapter


    由于个人时间原因,无法详细描述这些模式,暂且记录下来以后慢慢补充详细。

    Facade模式

    Facade模式:关键特征  
    意图 希望简化原有系统的使用方式。需要定义自己的接口。
    问题 只需使用某个复杂系统的子集,或者,需要以一种特殊的方式与系统交互。
    解决方案 Facade为原有系统的客户提供了一个新的接口。
    参与者与协作者 为客户提供一个简化接口,是系统更容易使用。
    效果 Facade模式简化了对所需子系统的使用过程。但是,由于Facade并不完整,因此客户可能无法使用某些功能。
    实现 1、定义一个(或多个)具备所需接口的新类。
    2、让新的类使用原有的系统。

    Adapter模式

    Adapter模式:关键特征  
    意图 使控制范围之外的一个原有对象与某个接口匹配。
    问题 系统的数据和行为都正确,但接口不符。通常用于必须从抽象类派生时。
    解决方案 Adapter模式提供了具有所需接口的包装类。
    参与者与协作者 Adapter改变了Adaptee的接口,使Adaptee与Adapter的基类Target匹配。这样Client就可以使用Adaptee了,好像它是Target类型。
    效果 Adapter模式使原有对象能够适应新的类结构,不受其接口的限制。
    实现 将原有类包含在另一个类中。让包含类与需要的接口匹配,调用被包容类的方法。

    Adapter

                                                      图1、Adapter模式的通用结构图

    一个Adapter模式的例子

    //Shape.h 
    
    #pragma once
    
    class Shape
    {
    public:
        Shape(void);
        void virtual display()= 0;
    public:
        ~Shape(void);
    };
     //Shape.cpp 
    
    #include "Shape.h"
    
    Shape::Shape(void)
    {
    }
    
    Shape::~Shape(void)
    {
    }
    //Circle.h 
    #pragma once
    #include "Shape.h"
    #include "XX_Circle.h"
    
    class Circle : public Shape
    {
    public:
        Circle(XX_Circle *xxCircle);
        void display();
    public:
        ~Circle(void);
    private:
        XX_Circle *myXX_Circle;
    };
    //Circle.cpp 
    
    #include "Circle.h"
    
    Circle::Circle(XX_Circle *xxCircle)
    {
        myXX_Circle = xxCircle;
    }
    
    Circle::~Circle(void)
    {
        delete myXX_Circle;
    }
    
    void Circle::display()
    {
        myXX_Circle->displayIt();
    }
    //XX_Circle.h 
    #pragma once
    
    class XX_Circle
    {
    public:
        XX_Circle(void);
        void displayIt();
    public:
        ~XX_Circle(void);
    };
    //XX_Circle.cpp 
    
    #include "XX_Circle.h"
    
    XX_Circle::XX_Circle(void)
    {
    }
    
    XX_Circle::~XX_Circle(void)
    {
    }

    Facade模式与Adapter模式的比较

     

    Facade模式

    Adapter模式

    是否存在既有的类?

    是否必须按照某个接口设计?

    对象需要多态行为吗?

    可能

    需要更简单的接口吗?

    未完待续……

  • 相关阅读:
    .NET反射的优化
    jdk、tomcat、solr环境搭建
    实现简单的ORM
    异步async/await简单应用与探究
    线程(Thread,ThreadPool)、Task、Parallel
    序列化
    IEnumerable与IEnumerator
    URL重写与URL路由
    django rest framework(10)
    restful 规范
  • 原文地址:https://www.cnblogs.com/sirocco/p/2950821.html
Copyright © 2020-2023  润新知