网站建设推广工作描述,自己做免费手机网站吗,做影视网站如何通过备案,窗帘网站建设策划书道客巴巴复习到设计模式的时候写的一些demo代码
回头可以看看
单例的几种比较简单就没写了#xff0c;专栏有
目录
观察者#xff08;发布--订阅模式#xff09;模式#xff0c;多个对象依赖于一个对象#xff0c;或者多对多
工厂模式#xff1a;主要是封装了对象的创建专栏有
目录
观察者发布--订阅模式模式多个对象依赖于一个对象或者多对多
工厂模式主要是封装了对象的创建简单方法抽象
简单工厂不在23种设计模式里
工厂方法
抽象方法
结构型模式
代理Proxy模式demo
适配器模式
装饰器模式Decorator 观察者发布--订阅模式模式多个对象依赖于一个对象或者多对多
/*subject有更改 要及时通知observer去做改变
*/
class Observer{//观察者抽象类//处理消息接口public:virtual void handleEvent(int msgid)0;
};
class Observer1:public Observer{public:void handleEvent(int msgid){ //做出相应动作switch (msgid){case 1:coutObserver1 received 1endl;break;case 2:coutObserver1 received 2endl;break;default:coutObserver1 received unknownendl;break;}}
};
class Observer2:public Observer{public:void handleEvent(int msgid){ //做出相应动作switch (msgid){case 2:coutObserver2 received 2endl;break;default:coutObserver2 received unknownendl;break;}}
};
//主题
class Subject{ private:unordered_mapint,listObserver* _subMap;public://给主题增加观察者对象void addObserver(Observer *obser,int msgid){_subMap[msgid].push_back(obser);}//主题改变 通知相应的观察者去处理事件void notifyObservers(int msgid){auto it _subMap.find(msgid);if(it ! _subMap.end()){//找到了for(Observer *ob:it-second){ob-handleEvent(msgid);}}}};int main(){Subject subject;Observer *p1new Observer1();Observer *p2new Observer2();subject.addObserver(p1,1);subject.addObserver(p1,2);subject.addObserver(p1,3);subject.addObserver(p2,2);subject.addObserver(p2,3);int msgid;while(1){cout消息id: endl;cinmsgid;subject.notifyObservers(msgid);if(msgid-1){break;}}system(pause);return 0;
}
工厂模式主要是封装了对象的创建简单方法抽象
简单工厂不在23种设计模式里
简单工厂demo把对象的创建封装在一个接口函数里通过传入不同的标识返回创建的对象好处是客户不用自己负责new对象不用了解对象具体创建的详细过程这种设计模式不好
缺点提供创建对象实例的接口函数不闭合不能对修改关闭
class Car{public:Car(string name):_name(name){}virtual void show()0;protected:string _name;
};
class BMW:public Car
{public:BMW(string name):Car(name){}void show(){cout宝马车endl;}
};
class Audi:public Car
{public:Audi(string name):Car(name){}void show(){cout奥迪车endl;}
};enum CarType{BMw,AUDI
};
class SimpleFactory{ //封装了 对象public:Car* CreateCar(CarType type){switch(type){case BMw:return new BMW(X1);break;case AUDI:return new Audi(A6);break;default:couttype errendl;break;}return nullptr;}
};
int main(){SimpleFactory *facnew SimpleFactory();Car *carfac-CreateCar(BMw);Car *car1fac-CreateCar(AUDI);car-show();car1-show();delete car;delete car1;delete fac;system(pause);return 0;
}工厂方法
把工厂划分成基类各个子工厂去继承方法
相应的工厂只需要创建自己厂家的东西就行还想增加奔驰就多个奔驰工厂去继承工厂类重写创建方法就好
对于已有的工厂不需要做改变做到了软件工程的开闭原则
工厂基类提供一个纯虚函数创建产品定义派生类具体工厂创建对应产品可以做到不同的产品在不同的工厂里创建能够对现有的工厂和产品进行修改关闭实际上很多产品是有关联关系的属于一个产品簇不应该放在不同的工厂去创建
class Car{public:Car(string name):_name(name){}virtual void show()0;protected:string _name;
};
class BMW:public Car
{public:BMW(string name):Car(name){}void show(){cout宝马车endl;}
};
class Audi:public Car
{public:Audi(string name):Car(name){}void show(){cout奥迪车endl;}
};//工厂方法
class Factory{
public:virtual Car* create(string name)0;
};
//宝马工厂
class BMWFactory:public Factory{
public:Car* create(string name){return new BMW(name);}
};
//奥迪工厂
class AudiFactory:public Factory{
public:Car* create(string name){return new Audi(name);}
};
int main(){Factory *facnew BMWFactory();Factory *fac1new AudiFactory();Car *carfac-create(BMw);Car *car1fac1-create(AUDI);car-show();car1-show();delete car;delete car1;delete fac;delete fac1;system(pause);return 0;
}
抽象方法
考虑生产一类产品比如生产手机耳机充电器总不能生产一种产品就创建一个工厂
上面的问题简单工厂无法解决引入抽象工厂
其实就是把工厂方法叠加起来了工厂基类的方法多了一些子工厂继承的就多 把有关联的产品簇里的所有产品创建的接口函数放在一个抽象工厂里派生类具体工厂应该负责创建该产品簇里的所有产品 //系列产品1 汽车
class Car{public:Car(string name):_name(name){}virtual void show()0;protected:string _name;
};
class BMW:public Car
{public:BMW(string name):Car(name){}void show(){cout宝马车_nameendl;}
};
class Audi:public Car
{public:Audi(string name):Car(name){}void show(){cout奥迪车_nameendl;}
};//系列产品2 车灯
class Light{public: virtual void show()0;
};
class BMWLight:public Light
{public: void show(){cout宝马 车灯endl;}
};
class AudiLight:public Light
{public:void show(){cout奥迪 车灯endl;}
};
//抽象工厂 对一组有关联关系的产品组提供产品的统一创建
class Factory{
public:virtual Car* createCar(string name)0;//工厂方法virtual Light* createLight()0;//工厂方法
};
//宝马工厂
class BMWFactory:public Factory{
public:Car* createCar(string name){return new BMW(name);}Light* createLight(){return new BMWLight();}};
//奥迪工厂
class AudiFactory:public Factory{
public:Car* createCar(string name){return new Audi(name);}Light* createLight(){return new AudiLight();}
};int main(){Factory *facnew BMWFactory();Factory *fac1new AudiFactory();Car *carfac-createCar(BMw);Car *car1fac1-createCar(AUDI);Light *l1fac-createLight();Light *l2fac1-createLight();car-show();l1-show();car1-show();l2-show();system(pause);return 0;
}结构型模式
代理Proxy模式demo
通过代理类来控制实际对象委托类的访问权限 客户 助理proxy 老板委托类
class VideoSite{public:virtual void freeMovie()0;//免费电影virtual void vipMovie()0;//vip 电影virtual void ticketMovie()0;//用劵
};
class FixBugVideoSite:public VideoSite{//委托类 拥有所有功能public:virtual void freeMovie(){coutfree movieendl;}virtual void vipMovie(){coutvip movieendl;}virtual void ticketMovie(){coutticket movieendl;}
};
//代理类
class FreeVideoProxy:public VideoSite{
public:FreeVideoProxy(){PVideo new FixBugVideoSite();}~FreeVideoProxy(){delete PVideo;}virtual void freeMovie(){PVideo-freeMovie();//通过代理对象的freemovie去访问真正委托类方法}virtual void vipMovie(){coutyou are free cant use vipendl;}virtual void ticketMovie(){coutno ticket cant see movieendl;}
private:VideoSite* PVideo;
};
//代理类
class VipVideoProxy:public VideoSite{
public:VipVideoProxy(){PVideo new FixBugVideoSite();}~VipVideoProxy(){delete PVideo;}virtual void freeMovie(){PVideo-freeMovie();//通过代理对象的freemovie去访问真正委托类方法}virtual void vipMovie(){PVideo-vipMovie();}virtual void ticketMovie(){coutvip no ticket cant see movieendl;}
private:VideoSite* PVideo;
};
int main()
{unique_ptrVideoSite p1(new FreeVideoProxy());p1-freeMovie();p1-vipMovie();p1-ticketMovie();system(pause);return 0;
} 适配器模式
让不兼容的接口可以在一起工作 电脑-》 投影到 -》 投影仪上 需要的线接口VGA HDMI TypeC
VGA接口的电脑投影仪也是VGA接口
HDMI的投影仪就要用适配器去转换
class VGA{
public:virtual void play()0;
};
//TV01表示支持VGA接口的投影仪
class TV01:public VGA{
public:void play(){coutuse VGA接口连接投影仪,进行视频播放endl;}
};//电脑类(只支持VGA接口)
class HuaweiComputer{
public:void playVideo(VGA *vga){vga-play();}
};
/*
1.换支持hdmi接口的电脑代码重构
2.买转换头适配器把vga信号转成hdmi信号添加适配器类
*///进了一批新的投影仪但是投影仪只支持HDMI接口
class HDMI{
public:virtual void play()0;
};class TV02:public HDMI{
public:void play(){coutuse HDMI接口连接投影仪,进行视频播放endl;}
};
//适配器类
class VGA_TO_HDMI:public VGA{
public:VGA_TO_HDMI(HDMI *p):pp(p){}void play(){//转换头pp-play();}
private:HDMI* pp;
};int main()
{HuaweiComputer c1;c1.playVideo(new TV01());c1.playVideo(new VGA_TO_HDMI(new TV02()));system(pause);return 0;
} 装饰器模式Decorator
装饰器增加现有类的功能
装饰器类持有需要被装饰的对象装饰器再可以根据功能去细分子类
class Car{//抽象基类public:virtual void show()0;
};
//实体类
class BMW:public Car{public:void show(){coutis bmw commonendl;}
};
class Benz:public Car{public:void show(){coutis Benz commonendl;}
};
//装饰器 定速巡航的功能
class ConcreteDecorator01:public Car{public:ConcreteDecorator01(Car *p):car(p) {}void show(){car-show();coutis concreteendl;}private:Car* car;
};
//装饰器 自动刹车功能
class StopDecorator01:public Car{public:StopDecorator01(Car *p):car(p) {}void show(){car-show();coutis Stopendl;}private:Car* car;
};int main()
{Car *p1new ConcreteDecorator01(new Benz());p1-show();p1new StopDecorator01(p1);p1-show();Car *p2new StopDecorator01(new BMW());p2-show();system(pause);return 0;
}