赞
踩
C++ 设计模式自己理解整理笔记
适配器模式(Adapter Pattern)是一种结构型设计模式,它的主要作用是将一个类的接口转换成客户希望的另一个接口,
使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式主要有两种实现方式:类适配器模式和对象适配器模式。
类适配器通过多重继承实现,这种方式利用了继承
- #include <iostream>
- #include <string>
-
-
- // 目标接口
- class Target
- {
- public:
- virtual ~Target() = default;
- virtual void request() const = 0;
- };
-
- // 需要适配的类
- class Adaptee
- {
- public:
- void specificRequest() const
- {
- std::cout << "Adaptee: Specific request.\n";
- }
- };
-
- // 类适配器
- class Adapter : public Target, private Adaptee
- {
- public:
- void request() const override
- {
- specificRequest();
- }
- };
-
- int main()
- {
- target *target = new adapter();
- target->request();
- delete target;
-
- return 0;
- }
对象适配器通过在适配器类中包含一个指向被适配对象的指针来实现。这种方式利用了对象组合
- #include <iostream>
- #include <string>
-
- // 目标接口
- class Target
- {
- public:
- virtual ~Target() = default;
- virtual void request() const = 0;
- };
-
- // 需要适配的类
- class Adaptee
- {
- public:
- void specificRequest() const
- {
- std::cout << "Adaptee: Specific request.\n";
- }
- };
-
- // 对象适配器
- class Adapter : public Target
- {
- private:
- Adaptee *adaptee;
-
- public:
- Adapter(Adaptee *a)
- : adaptee(a)
- {
- }
- void request() const override
- {
- adaptee->specificRequest();
- }
- };
-
- int main()
- {
- Adaptee *adptee = new Adaptee();
- Target *target = new Adapter(adptee);
- target->request();
-
- delete target;
- delete adptee;
- }
-
装饰器模式(Decorator Pattern)是一种结构型设计模式,允许向一个现有对象添加新的功能,同时又不改变其结构。装饰器模式通过创建一个装饰类来包装原始类,可以在不改变原始类代码的情况下扩展其功能。以下是装饰器模式的主要优缺点:
遵循开闭原则:
灵活性:
细粒度的功能扩展:
减少子类的数量:
增加复杂性:
创建大量的小对象:
依赖装饰器的顺序:
违背单一职责原则:
- #include <iostream>
- #include <string>
-
- //动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式相比生成子类更为灵活。
-
- //抽象类
- class Jbgz
- {
- public:
- virtual ~Jbgz() = default;
-
- virtual std::string GetName() = 0;
-
- virtual double GetMemary() = 0;
- };
-
- //实现类
- class SimpleJbgz : public Jbgz
- {
- public:
- virtual ~SimpleJbgz()
- {
- std::cout << "SimpleJbgz析构" << std::endl;
- }
-
- virtual std::string GetName() override
- {
- return "基本版 ";
- }
-
- virtual double GetMemary() override
- {
- return 5.5;
- }
- };
-
- class DecoratorJbgz : public Jbgz
- {
- public:
- ~DecoratorJbgz()
- {
- delete _jb;
- std::cout << "装饰类析构" << std::endl;
- }
-
- DecoratorJbgz(Jbgz *jb)
- : _jb(jb)
- {
- }
-
- protected:
- Jbgz *_jb = nullptr;
- };
-
- class EegJbgz : public DecoratorJbgz
- {
- public:
- ~EegJbgz()
- {
- std::cout << "Eeg析构" << std::endl;
- }
-
- EegJbgz(Jbgz *jb)
- : DecoratorJbgz(jb)
- {
- }
-
- std::string GetName() override
- {
- return _jb->GetName() + "Eeg ";
- }
-
- double GetMemary() override
- {
- return _jb->GetMemary() + 2.0;
- }
- };
-
- class LtJbgz : public DecoratorJbgz
- {
- public:
- ~LtJbgz()
- {
- std::cout << "LT析构" << std::endl;
- }
-
- LtJbgz(Jbgz *jb)
- : DecoratorJbgz(jb)
- {
- }
-
- std::string GetName() override
- {
- return _jb->GetName() + "Lt ";
- }
-
- double GetMemary() override
- {
- return _jb->GetMemary() + 1.0;
- }
- };
-
- int main()
- {
- Jbgz *simJb = new SimpleJbgz();
- std::cout << simJb->GetName() << std::endl;
- std::cout << simJb->GetMemary() << std::endl;
-
- simJb = new EegJbgz(simJb);
- std::cout << simJb->GetName() << std::endl;
- std::cout << simJb->GetMemary() << std::endl;
-
- simJb = new LtJbgz(simJb);
- std::cout << simJb->GetName() << std::endl;
- std::cout << simJb->GetMemary() << std::endl;
-
- delete simJb;
-
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。