网站建设与开发 教材什么是网站开发工程师

bicheng/2026/1/21 11:15:56/文章来源:
网站建设与开发 教材,什么是网站开发工程师,网络运营托管公司,装潢设计专业就业前景目录 0 、设计模式简介 一、单例模式 二、工厂模式 三、适配器模式 四、装饰器模式 0 、设计模式简介 设计模式可以分为以下三种: 创建型模式#xff1a;用来描述 “如何创建对象”#xff0c;它的主要特点是 “将对象的创建和使用分离”。包括单例、原型、工厂方法、…目录 0 、设计模式简介 一、单例模式 二、工厂模式 三、适配器模式 四、装饰器模式  0 、设计模式简介 设计模式可以分为以下三种:  创建型模式用来描述 “如何创建对象”它的主要特点是 “将对象的创建和使用分离”。包括单例、原型、工厂方法、抽象工厂和建造者 5 种模式。结构型模式用来描述如何将类或对象按照某种布局组成更大的结构。包括代理、适配器、桥接、装饰、外观、享元和组合 7 种模式。行为型模式用来识别对象之间的常用交流模式以及如何分配职责。包括模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录和解释器 11 种模式。 下面将介绍单例模式、工厂模式、适配器模式、组合模式。  一、单例模式 单例模式的实现需要三个必要的条件 单例类的构造函数必须是私有的这样才能将类的创建权控制在类的内部从而使得类的外部不能创建类的实例。单例类通过一个私有的静态变量来存储其唯一实例。单例类通过提供一个公开的静态方法使得外部使用者可以访问类的唯一实例。 注意 因为单例类的构造函数是私有的所以单例类不能被继承。 另外实现单例类时还需要考虑三个问题 创建单例对象时是否线程安全。单例对象的创建是否延时加载。获取单例对象时是否需要加锁锁会导致低性能。 单例模式分为两种饿汉方式和懒汉方式 饿汉方式在类加载的时候就实例化对象懒汉方式只有在使用的时候才初始化对象。 饿汉式单例优缺点 优点 单例对象的创建是线程安全的获取单例对象时不需要加锁。即不用考虑线程安全问题不需要加锁执行效率较高。缺点 单例对象的创建不是延时加载。类加载的时候就初始化不管后期用不用都占着空间浪费了内存 懒汉式单例优缺点 优点 对象的创建是线程安全的。支持延时加载。缺点获取对象的操作被加上了锁影响了并发度。 如果单例对象需要频繁使用那这个缺点就是无法接受的。如果单例对象不需要频繁使用那这个缺点也无伤大雅。 使用场景  饿汉式单例模式在类加载时就创建实例适用于单例对象的创建频繁的场景以及对于性能要求较高的场景。懒汉式单例模式在第一次被使用时创建实例适用于单例对象的创建不是很频繁的场景。 饿汉方式代码 class singleton{protected:singleton(){}private:static singleton* p;public:static singleton* initance();};singleton* singleton::p new singleton;singleton* singleton::initance(){return p;} 懒汉方式代码 class singleton { protected:singleton(){pthread_mutex_init(mutex);} private:static singleton* p; public:static pthread_mutex_t mutex;static singleton* initance(); };pthread_mutex_t singleton::mutex; singleton* singleton::p NULL; singleton* singleton::initance() {if (p NULL){pthread_mutex_lock(mutex);if (p NULL)p new singleton();pthread_mutex_unlock(mutex);}return p; } 二、工厂模式 工厂模式分为简单工厂模式、工厂方法模式、抽象工厂模式。 简单工厂模式提供一个工厂类在这个工厂类中生产A、B、C类产品。 工厂方法模式提供n个工厂类都继承自同一个总工厂类然后分别生产各自的产品。 抽象工厂模式提供n个工厂类都继承自同一个总工厂类然后分别生产各自的产品产品可以包含多种。也就是对于每一个工厂有多条生产线。 1.简单工厂模式 NiKeShoes、AdidasShoes、LiNingShoes为具体鞋子的类分别是耐克、阿迪达斯和李宁鞋牌的鞋它们都继承于Shoes抽象类。  // 鞋子抽象类 class Shoes { public:virtual ~Shoes() {}virtual void Show() 0; };// 耐克鞋子 class NiKeShoes : public Shoes { public:void Show(){std::cout 我是耐克球鞋我的广告语Just do it std::endl;} };// 阿迪达斯鞋子 class AdidasShoes : public Shoes { public:void Show(){std::cout 我是阿迪达斯球鞋我的广告语:Impossible is nothing std::endl;} };// 李宁鞋子 class LiNingShoes : public Shoes { public:void Show(){std::cout 我是李宁球鞋我的广告语Everything is possible std::endl;} }; ShoesFactory为工厂类类里实现根据鞋子类型创建对应鞋子产品对象的CreateShoes(SHOES_TYPE type)函数。  enum SHOES_TYPE {NIKE,LINING,ADIDAS };// 总鞋厂 class ShoesFactory { public:// 根据鞋子类型创建对应的鞋子对象Shoes *CreateShoes(SHOES_TYPE type){switch (type){case NIKE:return new NiKeShoes();break;case LINING:return new LiNingShoes();break;case ADIDAS:return new AdidasShoes();break;default:return NULL;break;}} }; main函数先是构造了工厂对象后创建指定类型的具体鞋子产品对象创建了具体鞋子产品的对象便可直接打印广告。因为采用的是new的方式创建了对象用完了要通过delete 释放资源资源。 int main() {// 构造工厂对象ShoesFactory shoesFactory;// 从鞋工厂对象创建阿迪达斯鞋对象Shoes *pNikeShoes shoesFactory.CreateShoes(NIKE);if (pNikeShoes ! NULL){// 耐克球鞋广告喊起pNikeShoes-Show();// 释放资源delete pNikeShoes;pNikeShoes NULL;}// 从鞋工厂对象创建阿迪达斯鞋对象Shoes *pLiNingShoes shoesFactory.CreateShoes(LINING);if (pLiNingShoes ! NULL){// 李宁球鞋广告喊起pLiNingShoes-Show();// 释放资源delete pLiNingShoes;pLiNingShoes NULL;}// 从鞋工厂对象创建阿迪达斯鞋对象Shoes *pAdidasShoes shoesFactory.CreateShoes(ADIDAS);if (pAdidasShoes ! NULL){// 阿迪达斯球鞋广告喊起pAdidasShoes-Show();// 释放资源delete pAdidasShoes;pAdidasShoes NULL;}return 0; } 输出结果 2.工厂方法模式 有的地方直接是抽象工厂模式即对工厂也进行了抽象 ShoesFactory抽象工厂类提供了创建具体鞋子产品的纯虚函数。 NiKeProducer、AdidasProducer、LiNingProducer具体工厂类继承持续工厂类实现对应具体鞋子产品对象的创建。 // 总鞋厂 class ShoesFactory { public:virtual Shoes *CreateShoes() 0;virtual ~ShoesFactory() {} };// 耐克生产者/生产链 class NiKeProducer : public ShoesFactory { public:Shoes *CreateShoes(){return new NiKeShoes();} };// 阿迪达斯生产者/生产链 class AdidasProducer : public ShoesFactory { public:Shoes *CreateShoes(){return new AdidasShoes();} };// 李宁生产者/生产链 class LiNingProducer : public ShoesFactory { public:Shoes *CreateShoes(){return new LiNingShoes();} }; main函数针对每种类型的鞋子构造了每种类型的生产线再由每个生产线生产出对应的鞋子。需注意的是具体工厂对象和具体产品对象用完了需要通过delete释放资源。  int main() {// 生产耐克流程 //// 鞋厂开设耐克生产线ShoesFactory *niKeProducer new NiKeProducer();// 耐克生产线产出球鞋Shoes *nikeShoes niKeProducer-CreateShoes();// 耐克球鞋广告喊起nikeShoes-Show();// 释放资源delete nikeShoes;delete niKeProducer;// 生产阿迪达斯流程 //// 鞋厂开设阿迪达斯生产者ShoesFactory *adidasProducer new AdidasProducer();// 阿迪达斯生产线产出球鞋Shoes *adidasShoes adidasProducer-CreateShoes();// 阿迪达斯球鞋广喊起adidasShoes-Show();// 释放资源delete adidasShoes;delete adidasProducer;return 0; } 输出结果 3.抽象工厂模式  鞋厂为了扩大了业务不仅只生产鞋子把运动品牌的衣服也一起生产了。 Clothe和Shoes分别为衣服和鞋子的抽象产品类。 NiKeClothe和NiKeShoes分别是耐克衣服和耐克衣服的具体产品类。 // 基类 衣服 class Clothe { public:virtual void Show() 0;virtual ~Clothe() {} };// 耐克衣服 class NiKeClothe : public Clothe { public:void Show(){std::cout 我是耐克衣服时尚我最在行 std::endl;} };// 基类 鞋子 class Shoes { public:virtual void Show() 0;virtual ~Shoes() {} };// 耐克鞋子 class NiKeShoes : public Shoes { public:void Show(){std::cout 我是耐克球鞋让你酷起来 std::endl;} }; Factory为抽象工厂提供了创建鞋子CreateShoes()和衣服产品CreateClothe()对象的接口。 NiKeProducer为具体工厂实现了创建耐克鞋子和耐克衣服的方式。 // 总厂 class Factory { public:virtual Shoes *CreateShoes() 0;virtual Clothe *CreateClothe() 0;virtual ~Factory() {} };// 耐克生产者/生产链 class NiKeProducer : public Factory { public:Shoes *CreateShoes(){return new NiKeShoes();}Clothe *CreateClothe(){return new NiKeClothe();} }; main函数构造耐克工厂对象通过耐克工厂对象再创建耐克产品族的衣服和鞋子对象。同样对象不再使用时需要手动释放资源。  int main() {// 生产耐克流程 //// 鞋厂开设耐克生产线Factory *niKeProducer new NiKeProducer();// 耐克生产线产出球鞋Shoes *nikeShoes niKeProducer-CreateShoes();// 耐克生产线产出衣服Clothe *nikeClothe niKeProducer-CreateClothe();// 耐克球鞋广告喊起nikeShoes-Show();// 耐克衣服广告喊起nikeClothe-Show();// 释放资源delete nikeShoes;delete nikeClothe;delete niKeProducer;return 0; } 输出结果 三、适配器模式 适配器模式的作用是解决两个软件实体间的接口不兼容的问题。将一个接口转换成客户希望的另一个接口使接口不兼容的那些类可以一起工作。 适配器模式有两种实现方法类适配器和对象适配器。类适配器以多继承方式实现。对象适配器以组合的方式实现即适配器类中包含了适配者类对象。调用了适配者类中的方法即新的方法 一共包含三个类目标类、适配者类、适配器类。目标类中的接口和适配者类中的接口不兼容可通过引入适配器类在适配器类中保留了原目标类的接口名调用了适配者类接口中的功能对功能重新进行了封装然后通过目标类指针指向适配器类对象或者目标类引用引用适配器类对象就可调用新的功能完成对该接口的功能完善。   应用场景通过适配器完成USB与TypeC的对接。原先接口功能是USB接口新的接口是TypeC接口需要完成适配即可以把USB接口当成TypeC接口来使用。相当于给中间连了转换器 类适配器代码 /* Connect Usb port */ class CUsbDisk { public:virtual ~CUsbDisk() {}virtual void ConnectDevice(){cout Connect usb port. endl;} };/* Connect Type-C port */ class CTypeCInterface { public:virtual ~CTypeCInterface() {}void ConnectDevice(){cout Connect Type-C port. endl;} };/* Not only connect Usb port, but also connect Type-C port */ class CAdapter : public CUsbDisk, public CTypeCInterface { public:void ConnectDevice(){//调用了适配者类中的方法即完善了功能用旧的名字调用了新的功能。CTypeCInterface::ConnectDevice();} };int main(int argc, char *argv[]) {//通过目标类指针指向适配器类对象调用了新的方法原先的接口及新的功能CUsbDisk *theDisk new CAdapter();theDisk-ConnectDevice();delete theDisk;return 0; } 输出结果 对象适配器模式 /* Connect Usb port */ class CUsbDisk { public:virtual ~CUsbDisk() {}virtual void ConnectDevice(){cout Connect usb port. endl;} };/* Connect Type-C port */ class CTypeCInterface { public:virtual ~CTypeCInterface() {}void ConnectDevice(){cout Connect Type-C port. endl;} };/* Usb device connect phone */ class CAdapter : public CUsbDisk { public:CAdapter(){mpAdaptee new CTypeCInterface();}~CAdapter(){if (NULL ! mpAdaptee) {delete mpAdaptee;}}void ConnectDevice(){if (NULL ! mpAdaptee) {mpAdaptee-ConnectDevice();} else {cout Adapter abnormal. Connect fail! endl;}}private://包含了适配者类对象通过该对象调用了新的方法重新封装了旧接口。CTypeCInterface *mpAdaptee; };int main(int argc, char *argv[]) {CUsbDisk *theDisk new CAdapter();theDisk-ConnectDevice();delete theDisk;return 0; } 输出结果 或 /*** The Target defines the domain-specific interface used by the client code.*/ class Target {public:virtual ~Target() default;virtual std::string Request() const {return Target: The default targets behavior.;} };/*** The Adaptee contains some useful behavior, but its interface is incompatible* with the existing client code. The Adaptee needs some adaptation before the* client code can use it.*/ class Adaptee {public:std::string SpecificRequest() const {return .eetpadA eht fo roivaheb laicepS;} };/*** The Adapter makes the Adaptees interface compatible with the Targets* interface using multiple inheritance.*/ class Adapter : public Target, public Adaptee {public:Adapter() {}std::string Request() const override {std::string to_reverse SpecificRequest();std::reverse(to_reverse.begin(), to_reverse.end());return Adapter: (TRANSLATED) to_reverse;} };/*** The client code supports all classes that follow the Target interface.*/ void ClientCode(const Target *target) {std::cout target-Request(); }int main() {std::cout Client: I can work just fine with the Target objects:\n;Target *target new Target;ClientCode(target);std::cout \n\n;Adaptee *adaptee new Adaptee;std::cout Client: The Adaptee class has a weird interface. See, I dont understand it:\n;std::cout Adaptee: adaptee-SpecificRequest();std::cout \n\n;std::cout Client: But I can work with it via the Adapter:\n;Adapter *adapter new Adapter;ClientCode(adapter);std::cout \n;delete target;delete adaptee;delete adapter;return 0; } 结果如下 Client: I can work just fine with the Target objects: Target: The default targets behavior.Client: The Adaptee class has a weird interface. See, I dont understand it: Adaptee: .eetpadA eht fo roivaheb laicepSClient: But I can work with it via the Adapter: Adapter: (TRANSLATED) Special behavior of the Adaptee.s 四、装饰器模式  装饰器模式是比较常用的一种设计模式Python中就内置了对于装饰器的支持。 具体来说装饰器模式是用来给对象增加某些特性或者对被装饰对象进行某些修改。 如上图所示需要被装饰的对象在最上方它自身可以有自己的实例一般通过抽象类来实现(Java中也可以通过接口实现)。 右侧中间是一个装饰器类或者接口其实内容与原对象基本一致不过我们自定义的装饰器一般会继承这个装饰器基类。 最下层就是具体的装饰器了可以看到具体装饰器类中需要包含被装饰对象成员也就是说装饰器需要和被装饰对象有同样的子类然后增加一些额外的操作。 下面的代码是一个买煎饼的例子如我们生活中所见可以选基础煎饼鸡蛋煎饼肉煎饼等然后再额外加别的东西。 代码如下 #includeiostream #includestring using namespace std;class Pancake//基类 { public:string description Basic Pancake;virtual string getDescription(){ return description; }virtual double cost() 0; };class CondimentDecorator :public Pancake//装饰器基类 { public:string getDescrition(); };class MeatPancake :public Pancake//肉煎饼 { public:MeatPancake(){ description MeatPancake; }double cost(){ return 6; } }; class EggPancake :public Pancake//鸡蛋煎饼 { public:EggPancake(){ description EggPancake; }double cost(){ return 5; } };class Egg :public CondimentDecorator//额外加鸡蛋 { public:Pancake* base;string getDescription(){ return base-getDescription() , Egg; }Egg(Pancake* d){ base d; }double cost(){ return base-cost() 1.5; } }; class Potato :public CondimentDecorator//额外加土豆 { public:Pancake* base;string getDescription(){ return base-getDescription() , Potato; }Potato(Pancake* d){ base d; }double cost(){ return base-cost() 1; } }; class Bacon :public CondimentDecorator//额外加培根 { public:Pancake* base;string getDescription(){ return base-getDescription() , Bacon; }Bacon(Pancake* d){ base d; }double cost(){ return base-cost() 2; } };int main() {Pancake* pan new EggPancake();pan Potato(pan);pan Bacon(pan);cout pan-getDescription() $ : pan-cost() endl;system(pause);return 0; }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/88203.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手机app wap网站模板下载个人所得税app下载

在城市规划与防灾减灾的领域中,城市内涝积水监测系统的构建至关重要。随着城市化进程的加快,城市内涝问题日益凸显,对市民的生活质量和生命财产安全构成威胁。为了应对这一问题,建设一套高效、精准的城市内涝积水监测系统势在必行…

asp化妆品网站网站建设参考论文

(点击上方快速关注并设置为星标,一起学Python)来源:网络大家可能都熟悉.zip格式的文件。它可以把多个文件,压缩成一个文件。这在网络上传输时很有用,而且节省硬盘空间。接下来,我们使用Python实现压缩和解压。1、读取Z…

关于加强门户网站建设长沙模板建网站需要多久

一、Jupyter Lab使用conda虚拟环境 1、给虚拟环境添加 ipykernel 方法一: 创建环境时直接添加ipykernel 方法:conda create -n 【虚拟环境名称】python3.8 ipykernel实例如下: conda create -n tensorflow_cpu python3.8 ipykernel 方法二&#xff…

网站群 推广现在网站建设用什么软件

使用技术: Spring CloudSpring BootMybatis微服务服务监控可视化运营 B2B2C平台: 平台管理端(包含自营) 商家平台端(多商户入驻) PC买家端、手机wap/公众号买家端 微服务(30个通用微服务如:商品、订单、购物车、个人中心、支…

自由贸易试验区网站建设方案昆明网站建设有限公司

使用JS变量 navigator.onLine 是true还是false,可以判断在线还是离线。 不知道是不是html5的功能,在IE7,FF,Chrome下都是ok的。 如果你还想知道网络状况是wifi,还是2G,3G什么的,有少数部分浏览…

访问网站详细过程wordpress ui框架

CNN中常见的池化操作有哪些,作用是什么? CNN中常见的池化操作只要是两种,平均值池化和最大值池化最大值池化常用于分类任务,是指在输入数据的局部区域内取最大值作为输出。最大池化的作用是降低特征图的尺寸,减少参数…

都匀网站开发公司番禺网站建设服务

相信大家对元素应该是不陌生的,当我们页面中,我们想要布局,给元素添加样式的时候,我们应该怎么获取到指定元素呢? 优先级:ID 选择器 > 类选择器 > 标签选择器 > 通配符 1.元素选择器 通过标签名…

和顺网站建设桂林网络公司有哪些

NC51189 Mondriaan’s Dream 题意: n * m的矩阵,用1 * 2和2 * 1的砖快密铺,问多少种方法: 题解: 方法1: 我们现在规定砖头的竖放的上部分为1,砖头的横放或者是竖放的下部分为0 我们每两层进…

黑马大数据培训seo是什么工作内容

文章目录 引言一、什么是二叉堆?1.1什么是最大堆、最小堆?1.2堆的基本操作1.2.1插入节点元素1.2.2删除节点元素1.2.3构建二叉堆 1.3堆特性总结 二、DelayedWorkQueue源码解析2.1 DelayedWorkQueue参数解析2.2 DelayedWorkQueue方法解析 总结 引言 该系列…

做垂直类网站邢台专业网站建设价格

日前,“四十大盗”发布服务器CPU屠龙710。就“四十大盗”公司公布的数据来看,屠龙710是一款非常优秀的ARM芯片,在SPECInt2017基础测试中屠龙710跑分达到440分,超过行业标杆20%。不过,和以前FT、HW的ARM服务器CPU类似&a…

花木企业网站源码项目商业网站建设方案

一、导言 1、什么是svn? SVN是Subversion的简称,是一个集中式版本控制系统。与Git不同,SVN没有分布式的特性。在SVN中,项目的代码仓库位于服务器上,团队成员通过向服务器提交和获取代码来实现版本控制。SVN记录了每个文…

校园二手交易网站开发网站创建工具

背景 云原生趋势下,应用容器化比例正在快速增长,Kubernetes 也已成为云原生时代新的基础设施。 观察今天的容器和 Kubernetes 的应用现状,可以看到两个普遍的现象: 首先,在云上托管 Kubernetes 已经成为企业上云及运…

国外优惠卷网站如何做htm5网站

无向图联通分量 点u是割点,当且仅当 特判树根:u为树根,且u有多于1棵子树u不为树根,在递归树上u存在子节点v,满足:dfnu≤lowv\text{dfn}_u\leq \text{low}_vdfnu​≤lowv​ 如上图,v想走到u的组…

网站建设 h5 小程序网页广告怎么拦截

事务的传播行为 事务的第一个方面是传播行为(propagation behavior)。当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的…

替人做赌彩网站被判刑大连网站制作的公司

前言 视频监控是智慧城市、智慧园区等WebGIS类系统中最为常见的硬件对接设备,最常用的监控视频流格式为m3u8格式,但是m3u8格式通常都是h.265编码格式的,我搜遍了几乎所有前端视频播放插件,几乎普通的播放器插件都不支持h.265格式…

美工宝盒网站企业门户系统

在没有域名的情况下,有时候需要调试接口等需要此工具 安装curl、telnet、vim等 直接使用 apk add curlapk add vimapk add tennet

做app网站公司saas小程序

Vue指令【2】 显示切换与属性绑定v-show指令v-if指令v-bind指令 显示切换与属性绑定 v-show指令 作用&#xff1a;根据真假切换元素的显示状态 指令后的内容最终都会解析为布尔值数据改变之后&#xff0c;对应元素的显示状态会同步更新 语法&#xff1a; <div id"…

成都关键词优化网络营销优化推广公司

介绍了五款在线编译、编译、运行的C线上环境。并选择其中的 “在线GDB” 网站动手编写、运行第一个C程序 “Hello World”&#xff0c;同时和线下IDE进行对比。 1. 课堂视频 打开浏览器&#xff0c;线上玩转C 2. 在线C编译环境对比 onlinegdb &#xff1a; www.onlinegdb.comr…

jsp网站开发软件分享到微信 没有图标 wordpress

uniapp小程序连接蓝牙设备 一、初始化蓝牙模块二、开始搜索三、连接蓝牙四、监听特征值变化五、调用示例utils.js文件 一、初始化蓝牙模块 这一步是必须的&#xff0c;在开发项目过程中&#xff0c;初始化蓝牙模块之后&#xff0c;紧接着就要开启一些监听的api&#xff0c;供后…

西安做商铺的网站php网站建设一流程

一.简单介绍 HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架&#xff0c;只需编写维护一份 YAML/JSON 脚本&#xff0c;即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。 支持python2和python3 二.框架特点 继承 Requests 的全部特性&#xff0c;轻松实现…