做个外贸网站多少钱,零售客户电商网站,做婚礼效果图的网站有哪些,wordpress内容构建器结构型
适配器模式#xff0c;代理模式#xff0c;桥接模式#xff0c;装饰器模式#xff0c;外观模式#xff0c;组合模式#xff0c;享元模式#xff0c;
单一职责避免子类爆炸Bridge 模式对象的实现Decorator 模式对对象的职责#xff0c;不生成子类接口隔离Adapt…结构型
适配器模式代理模式桥接模式装饰器模式外观模式组合模式享元模式
单一职责避免子类爆炸Bridge 模式对象的实现Decorator 模式对对象的职责不生成子类接口隔离Adapter 模式针对对象的接口Facade 模式对一个子系统的接口Proxy 模式如何访问一个对象该对象的位置数据结构Composite 模式一个对象的结构和组成对象性能Flyweight 模式对象的存储开销
单一职责(避免子类爆炸)
subclass explode
Bridge 桥接模式
概念
桥接模式和装饰器模式一样解决因为没有遵循单一职责原则而导致的子类数量爆炸。 装饰器模式 组合且继承 子类可能会调用其他子类的实现。 桥接模式 组合而不继承。 实现类 不会调用其他子类的实现 实现类对应拆分前的子类实际上由于没有继承所以这里叫实现类更好。 核心思想都是一样的组合优于继承单一职责。
具体来说1nn*m 个子类变为 1 纯虚 ( 1通用实现) n iml实现类 m个应用场景
1 纯虚接口n 平台实现Impm 业务抽象(特定平台不同版本) (Imp平台实现作为参数 拼装)
业务抽象不需要继承接口或者平台实现持有的基类的指针运行时会指向iml平台实现实现类。
桥接模式实现了抽象化与实现化的脱耦。他们两个互相独立不会影响到对方。对于两个独立变化的维度使用桥接模式再适合不过了。分离抽象接口及其实现部分。提高了比继承更好的解决方案
code
bridge.h
#include cstdio
#include iostreamclass AbstractionImp {
public:virtual void Operation_RunPythonInTerminal() 0;
};// ConcreteAbstractionImp
class ConcreteAbstractionImp_Python2 : public AbstractionImp {
public:void Operation_RunPythonInTerminal() {printf(start python2 \n);}
};class ConcreteAbstractionImp_Python3 : public AbstractionImp {
public:void Operation_RunPythonInTerminal() {printf(start python3 \n);}
};
bridge.cpp
#include bridge_Imp.h
// class AbstractionImp;class Abstraction {
public:AbstractionImp* mImp nullptr;virtual void Operation_RunPythonInTerminal() 0;
};class RefinedAbstraction_Windows : public Abstraction{
public:void Operation_RunPythonInTerminal() {printf(windows start WSL\n);if (mImp)mImp-Operation_RunPythonInTerminal();}
};class RefinedAbstraction_Linux : public Abstraction{
public:void Operation_RunPythonInTerminal() {printf(linux start cmd\n);if (mImp)mImp-Operation_RunPythonInTerminal();}
};int main() {Abstraction* mOS new RefinedAbstraction_Windows;AbstractionImp* mPython new ConcreteAbstractionImp_Python3;mOS-mImp mPython;mOS-Operation_RunPythonInTerminal();free(mPython);mPython new ConcreteAbstractionImp_Python2;mOS-mImp mPython;mOS-Operation_RunPythonInTerminal();free(mPython);free(mOS);return 0;
}Decorator 装饰器
概念
单一职责避免了子类的无限制膨胀消除重复代码兼具开闭选择。 特征 子类继承基类 多继承多子类衍生 时的一个解决方法 子类持有基类的指针。 根据里氏替换可以调用基类的同名方法并在前后加上子类的操作。组合优于继承。 应用于 主体类多个方向上的扩展功能 主体操作和扩展操作应该分开分支继承。 扩展操作通过持有的主体操作的指针造成附加动作之后 调用主体操作。
code
#include cstdio
#include iostream
#include iostream
#include stringclass DecoratorBase {
public:DecoratorBase* mImp nullptr;virtual void Operation() 0;
};class ImpParty : public DecoratorBase {
public:std::string bro ;ImpParty(std::string bro) {this-bro bro;}void setBro(std::string name) {this-bro name;}void Operation() {printf(Party start, hi %s\n, bro.c_str());if (mImp) {printf(lets drink!\n);mImp-Operation();}}
};class ImpSoftDrink : public DecoratorBase {
public:std::string softdrink ;ImpSoftDrink(std::string softdrink) {this-softdrink softdrink;}void Operation() {printf(lets drink %s, softdrink.c_str());}
};int main() {ImpParty* mParty new ImpParty(John);ImpSoftDrink* mDrink new ImpSoftDrink(cola);mParty-mImp mDrink;mParty-Operation();delete mDrink;delete mParty;return 0;
}数据结构
composite 组合模式
概念
将对象组合成树状结构树形结构不暴露给外界。
Compoment
树节点 composite 子类 持有 一个子类的链表 add remove方法修改 其中的子类的链表 process方法执行子类链表中所有子类的process函数。直到叶子节点
叶子节点 leaf 没有链表process函数执行功能。
接口隔离
其它人的代码
Adoptor 适配器模式
概念
为了完成某项工作购买了一个第三方的库来加快开发。这就带来了一个问题我们在应用程序中已经设计好了接口与这个第三方提供的接口不一致为了使得这些接口不兼容的类不能在一起工作可以在一起工作了Adapter 模式提供了将一个类第三方库的接口转化希望的接口。
Itarget新实现的接口。adapter新实现。adaptee被适配的旧类
适配器模式分为类模式和对象模式。 常用做法。对象模式对象适配器 adapter采用组合原有接口类的方式 持有adaptee组合用于实现。 public继承Itarget 接口。 不常用做法。类模式类适配器 adapter采用继承原有接口类的方式 protect继承adaptee用于实现。 public继承Itarget接口。(不灵活 继承的方案不灵活 类的多继承在cpp之外的语言压根就不支持)
code 继承
#include cstdio
class Target_rob {
public:virtual int giveMeYrMoney() 0;
};class Adaptee_robInFrance {
public:int doRob() {printf(Levez les mains, donnez moi votre argent!\n);return 1000;}
};class Adaptor_rob : public Target_rob, Adaptee_robInFrance {
public:int giveMeYrMoney() {return doRob();}
};int main() {Target_rob* mClinet dynamic_castTarget_rob*(new Adaptor_rob());int money mClinet-giveMeYrMoney();printf(we got %d RMB!, money);
}
code 组合
#include cstdio
#include cstdlib
class Adaptee_rob {
public:virtual int doRob() 0;
};
class Adaptee_robInFrance : public Adaptee_rob {
public:int doRob() {printf(Levez les mains, donnez moi votre argent!\n);return 1000;}
};class Target_rob {
public:Adaptee_rob* mAdaptee nullptr;virtual int giveMeYrMoney() 0;
};class Adaptor_rob : public Target_rob {
public:int giveMeYrMoney() {int money 0;if (mAdaptee) {money mAdaptee-doRob();} else {printf(we got nothing \n);}return money;}
};int main() {Target_rob* mClinet dynamic_castTarget_rob*(new Adaptor_rob());Adaptee_rob* mRobber dynamic_castAdaptee_rob*(new Adaptee_robInFrance());mClinet-mAdaptee mRobber;int money mClinet-giveMeYrMoney();printf(we got %d RMB!, money);return 0;
}facade 门面模式
facad 门面模式 解欧系统见的交互
框架层面没有具体的实例代码。对内 高内聚 对外应该松耦合。
封装内部可能高度复杂 高度耦合的盒子。例如安卓的vendor hal。数据访问相关sql等等。
Proxy 代理模式
在不失去透明操作对象的同时控制管理这些对象内部特有的复杂性
对其他对象特供一种代理以控制 (隔离 使用接口)对这个接口的访问。
对象创建开销大某些操作需要安全控制需要进程外的访问(分布式等)
对象性能
Flyweight 享元模式
内存池每个字的字体单例模式从容器中取出。
实现 右值引用 复制clone原型模式
––– 接口隔离 ––– List item