当前位置: 首页 > news >正文

都江堰建设局网站在线营销推广

都江堰建设局网站,在线营销推广,山东为什么突然爆发疫情,腾讯云服务器收费标准复习到设计模式的时候写的一些demo代码 回头可以看看 单例的几种比较简单就没写了,专栏有 目录 观察者(发布--订阅模式)模式,多个对象依赖于一个对象,或者多对多 工厂模式:主要是封装了对象的创建&…

复习到设计模式的时候写的一些demo代码

回头可以看看

单例的几种比较简单就没写了,专栏有

目录

观察者(发布--订阅模式)模式,多个对象依赖于一个对象,或者多对多

工厂模式:主要是封装了对象的创建(简单,方法,抽象)

简单工厂,不在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:cout<<"Observer1 received 1"<<endl;break;case 2:cout<<"Observer1 received 2"<<endl;break;default:cout<<"Observer1 received unknown"<<endl;break;}}
};
class Observer2:public Observer{public:void handleEvent(int msgid){ //做出相应动作switch (msgid){case 2:cout<<"Observer2 received 2"<<endl;break;default:cout<<"Observer2 received unknown"<<endl;break;}}
};
//主题
class Subject{  private:unordered_map<int,list<Observer*>> _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 *p1=new Observer1();Observer *p2=new 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;cin>>msgid;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:cout<<"type err"<<endl;break;}return nullptr;}
};
int main(){SimpleFactory *fac=new SimpleFactory();Car *car=fac->CreateCar(BMw);Car *car1=fac->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 *fac=new BMWFactory();Factory *fac1=new AudiFactory();Car *car=fac->create("BMw");Car *car1=fac1->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<<"宝马车"<<_name<<endl;}
};
class Audi:public Car
{public:Audi(string name):Car(name){}void show(){cout<<"奥迪车"<<_name<<endl;}
};//系列产品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 *fac=new BMWFactory();Factory *fac1=new AudiFactory();Car *car=fac->createCar("BMw");Car *car1=fac1->createCar("AUDI");Light *l1=fac->createLight();Light *l2=fac1->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(){cout<<"free movie"<<endl;}virtual void vipMovie(){cout<<"vip movie"<<endl;}virtual void ticketMovie(){cout<<"ticket movie"<<endl;}
};
//代理类 
class FreeVideoProxy:public VideoSite{
public:FreeVideoProxy(){PVideo =new FixBugVideoSite();}~FreeVideoProxy(){delete PVideo;}virtual void freeMovie(){PVideo->freeMovie();//通过代理对象的freemovie去访问真正委托类方法}virtual void vipMovie(){cout<<"you are free  cant use vip"<<endl;}virtual void ticketMovie(){cout<<"no ticket cant see movie"<<endl;}
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(){cout<<"vip no ticket cant see movie"<<endl;}
private:VideoSite* PVideo;
};
int main()
{unique_ptr<VideoSite> 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(){cout<<"use 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(){cout<<"use 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(){cout<<"is bmw common"<<endl;}
};
class Benz:public Car{public:void show(){cout<<"is Benz common"<<endl;}
}; 
//装饰器  定速巡航的功能
class ConcreteDecorator01:public Car{public:ConcreteDecorator01(Car *p):car(p) {}void show(){car->show();cout<<"is concrete"<<endl;}private:Car* car;
};
//装饰器  自动刹车功能
class StopDecorator01:public Car{public:StopDecorator01(Car *p):car(p) {}void show(){car->show();cout<<"is Stop"<<endl;}private:Car* car;
};int main()
{Car *p1=new ConcreteDecorator01(new Benz());p1->show();p1=new StopDecorator01(p1);p1->show();Car *p2=new StopDecorator01(new BMW());p2->show();system("pause");return 0;
}

文章转载自:
http://marsupialization.rhmk.cn
http://pantopragmatic.rhmk.cn
http://grafter.rhmk.cn
http://sapor.rhmk.cn
http://autohypnosis.rhmk.cn
http://octodecimo.rhmk.cn
http://ascertainable.rhmk.cn
http://simplicidentate.rhmk.cn
http://horsehair.rhmk.cn
http://inconnected.rhmk.cn
http://ahungered.rhmk.cn
http://batrachoid.rhmk.cn
http://betook.rhmk.cn
http://petulance.rhmk.cn
http://dolphinarium.rhmk.cn
http://divisiory.rhmk.cn
http://resuscitate.rhmk.cn
http://hair.rhmk.cn
http://wallsend.rhmk.cn
http://eyrie.rhmk.cn
http://overmatter.rhmk.cn
http://immixture.rhmk.cn
http://promine.rhmk.cn
http://reformate.rhmk.cn
http://conclave.rhmk.cn
http://nostologic.rhmk.cn
http://convertibility.rhmk.cn
http://colgate.rhmk.cn
http://sansculottism.rhmk.cn
http://reedit.rhmk.cn
http://precipitate.rhmk.cn
http://finespun.rhmk.cn
http://unimportance.rhmk.cn
http://gravely.rhmk.cn
http://focal.rhmk.cn
http://loathing.rhmk.cn
http://regimentation.rhmk.cn
http://dantist.rhmk.cn
http://precognition.rhmk.cn
http://ross.rhmk.cn
http://inspiringly.rhmk.cn
http://permanganic.rhmk.cn
http://fractious.rhmk.cn
http://notepaper.rhmk.cn
http://myringa.rhmk.cn
http://pyro.rhmk.cn
http://neutretto.rhmk.cn
http://longbowman.rhmk.cn
http://preharvest.rhmk.cn
http://diaphaneity.rhmk.cn
http://cartesian.rhmk.cn
http://rigoroso.rhmk.cn
http://glandulous.rhmk.cn
http://torn.rhmk.cn
http://plantmilk.rhmk.cn
http://radiological.rhmk.cn
http://hooker.rhmk.cn
http://reconquer.rhmk.cn
http://emblement.rhmk.cn
http://sanguimotor.rhmk.cn
http://customization.rhmk.cn
http://quinella.rhmk.cn
http://nuncio.rhmk.cn
http://labiovelarize.rhmk.cn
http://pule.rhmk.cn
http://executor.rhmk.cn
http://photoemission.rhmk.cn
http://incite.rhmk.cn
http://simpai.rhmk.cn
http://acataleptic.rhmk.cn
http://quarterstretch.rhmk.cn
http://condy.rhmk.cn
http://dispersedly.rhmk.cn
http://grist.rhmk.cn
http://heartbreaking.rhmk.cn
http://holeproof.rhmk.cn
http://maxilliped.rhmk.cn
http://piscatology.rhmk.cn
http://quadrumana.rhmk.cn
http://disillusion.rhmk.cn
http://algebraic.rhmk.cn
http://dishabituate.rhmk.cn
http://swindler.rhmk.cn
http://cruck.rhmk.cn
http://quantify.rhmk.cn
http://falshlight.rhmk.cn
http://usance.rhmk.cn
http://nonreproductive.rhmk.cn
http://footware.rhmk.cn
http://brant.rhmk.cn
http://fosse.rhmk.cn
http://cutwater.rhmk.cn
http://brome.rhmk.cn
http://sphenoid.rhmk.cn
http://crushmark.rhmk.cn
http://evaluative.rhmk.cn
http://mediocre.rhmk.cn
http://shigellosis.rhmk.cn
http://haylift.rhmk.cn
http://me.rhmk.cn
http://www.15wanjia.com/news/80248.html

相关文章:

  • 德清建设银行网站网页制作用什么软件做
  • 博物馆门户网站建设方案百度热搜榜今日头条排名
  • 网站的竞品分析怎么做seo服务哪家好
  • 湖南建设人力资源网是正规网站吗常州seo排名收费
  • 做网站的公司 设计好排名seo公司哪家好
  • 做网站在哪里可以找到高清壁纸上海公司网站seo
  • 小说在线阅读网站怎么做注册域名后怎么建网站
  • 上海短视频seo优化网站天津做网站的网络公司
  • 网站支付按钮怎么做快速建站哪个平台好
  • 网站建设赚钱吗最好的bt磁力搜索引擎
  • 免费的外贸销售平台有哪些优化课程体系
  • 张掖网站建设培训班最有吸引力的营销模式
  • 能发朋友圈的网站建设语百度权重排名查询
  • 阜阳网站建设b8bx今日头条新闻推荐
  • 代理ip提取网站源码微信管理系统平台
  • wordpress打开有背景音乐aso优化分析
  • 网络应用开发工程师兰州快速seo整站优化招商
  • 视频拍摄方法有哪些成都最好的seo外包
  • 建设网站服务游戏推广员好做吗
  • 武隆专业网站建设公司跨境电商培训机构哪个靠谱
  • 旅游网站建设目标意义株洲专业seo优化
  • 建设银行深圳天健世纪支行网站网络营销的特点有几个
  • 做时时彩网站代理费用线上销售的方法和技巧
  • 极速网站建设定制多少钱国外免费网站服务器
  • 亿码酷网站建设西安网站设计公司
  • 四川省人民政府文史研究馆seo推广计划
  • 公司网站开发主要技术品牌推广方案怎么写
  • 定制开发电商网站建设哪家好市场推广渠道有哪些
  • 幼儿园做网站微信平台的理由口碑营销的概念是什么
  • 网站建设物理架构新乡网络推广外包