结构型模式

基于51单片机的通讯聊天系统 通过编写51单片机通讯聊天程序,掌握51单片机的各个模块的知识点和运用C语言编写51单片机的能力。用51单片机与口袋开发板设计实现一个单片机与电脑串口助手实现通讯功能的程序。程序的主要功能如下: 1 OLED初始化显示Welcome to Bluetooth communication! 字符串。 2 程序开始时处于接收信息模式, 电脑串口助手发送信息时,将从初始化字符第一个开始显示,电脑串口助手发送信息后,蜂鸣器响铃2秒左右。 3 每次同时按下左右键时,可以轮流切换接收/发送信息模式 4 在发送信息模式时 阅读详情

代理模式

#include<iostream>
#include<string>
using namespace std;

// 抽象(某个东西买票)
class AbstractSubject
{
public:
	virtual void BuyTicket() = 0;
    virtual ~AbstractSubject() {};
};

// 具体(男人直接去买票)
class Man :public AbstractSubject
{
public:
	void BuyTicket()
	{
		cout << "Man 购票成功!" << endl;
	}
};

// 具体(女人直接去买票)
class Woman :public AbstractSubject
{
public:
	void BuyTicket()
	{
		cout << "Woman 购票成功!" << endl;
	}
};

// 具体(通过美团去代理买票)
class Meituan : AbstractSubject
{
public:
	Meituan(AbstractSubject* obj)
	{
		this->meituanUser = obj;		// 接收要被代理的对象
	}

	// 执行"代理买票"的任务
	void BuyTicket()
	{
		cout << "正在通过美团进行购票..." << endl;
		meituanUser->BuyTicket();
	}

private:
	AbstractSubject* meituanUser;		// 美团使用者
};


int main()
{
	AbstractSubject* man = new Man;		// 实例一个男人出来
	man->BuyTicket();					// 让这个男人直接去买票

	AbstractSubject* woman = new Woman;	// 实例一个女人出来
	woman->BuyTicket();					// 让这个女人直接去买票

	// 实例一个美团对象,并且上面的男人使用美团进行代理买票
	AbstractSubject* meituanOfMan = (AbstractSubject*) new Meituan(man);
	meituanOfMan->BuyTicket();

	// 实例一个美团对象,并且上面的女人使用美团进行代理买票
	AbstractSubject* meituanOfWoman = (AbstractSubject*) new Meituan(woman);
	meituanOfWoman->BuyTicket();


	delete meituanOfWoman;
	delete meituanOfMan;
	delete woman;
	delete man;

	system("pause");
	return 0;
}

装饰者模式

#include<iostream>
#include<string>
using namespace std;

// 人物(抽象)
class People
{
public:
	string wearingState;		// 记录人物的穿着状态
	virtual void show() = 0;	// 展示人物的穿着状态
	virtual ~People() {};
};

// 女孩(具体)
class Girl : public People
{
public:
	// 实例化一个女孩时,初始化她的穿着状态
	Girl()
	{
		this->wearingState = "女孩穿着,长裤睡衣,长袖睡衣";
	}

	// 展示女孩的穿着
	void show()
	{
		cout << this->wearingState << endl;
	}
};

// 男孩(具体)
class Boy : People
{
public:
	// 实例化一个男孩时,初始化他的穿着状态
	Boy()
	{
		this->wearingState = "男孩穿着,短裤睡衣,短袖睡衣";
	}

	// 展示男孩的穿着
	void show()
	{
		cout << this->wearingState << endl;
	}
};

// 换装(抽象)
class ChangingClothes
{
public:
	string wearingState;				// 记录换装后的穿着状态
	virtual void show() = 0;			// 展示换装后的穿着状态
	virtual ~ChangingClothes() {};

protected:
	People* people;		// 每个换装对象,对应(维护)一个具体的"男孩或女孩"(人)对象
};

// 换成校服
class ChangeIntoSchoolUniform : public ChangingClothes
{
public:
	// 实例化一个换校服对象时,更新“男孩或女孩”的穿着状态
	ChangeIntoSchoolUniform(People* people)
	{
		this->people = people;
		this->wearingState = this->people->wearingState + ", 但是最后换成了‘校服’";
	}

	// 展示最新的穿着状态
	void show()
	{
		cout << this->wearingState << endl;
	}
};

// 换成运动装
class ChangeIntoSportswear : public ChangingClothes
{
public:
	// 实例化一个换成运动装对象时,更新“男孩或女孩”的穿着状态
	ChangeIntoSportswear(People* people)
	{
		this->people = people;
		this->wearingState = this->people->wearingState + ", 但是最后换成了‘运动装’";
	}

	// 展示最新的穿着状态
	void show()
	{
		cout << this->wearingState << endl;
	}
};

int main()
{
	// 实例化一个男生,并展示他的穿着状态
	People* boy = (People*) new Boy;
	boy->show();

	// 实例化一个女生,并展示她的穿着状态
	People* girl = (People*) new Girl;
	girl->show();

	// -------------------- 装饰 --------------------

	// 让男生穿上运动装,并再次展示他的穿着状态
	ChangingClothes* newBoy = new ChangeIntoSportswear(boy);
	newBoy->show();

	// 让女生穿上校服,并再次展示她的穿着状态
	ChangingClothes* newGirl = new ChangeIntoSchoolUniform(girl);
	newGirl->show();


	delete boy;
	delete girl;
	delete newBoy;
	delete newGirl;

	system("pause");
	return 0;
}

适配器模式

对象适配器

#include<iostream>
#include<string>
using namespace std;

// 电源插座案例:三插头和两插头的适配
// 用户本身只有三插头
// 用户现在需要将三插头转换为两插头

// 三插头(具体)
class ThreePlug
{
public:
	void threePlugCharge()		// 执行充电
	{
		cout << "开始充电..." << endl;
	}
};

// 两插头(抽象)
class AbstractTwoPlug
{
public:
	virtual void twoPlugCharge() = 0;
	virtual ~AbstractTwoPlug() {};
};

// 两插头(具体)
class TwoPlug
{
public:
	void twoPlugCharge()		// 执行充电
	{
		cout << "开始充电..." << endl;
	}
};

// 插头转换器(继承了两插头的功能)
class PlugConverter : public AbstractTwoPlug
{
public:
	// 实例化一个插头转换器的时候,请将三插头传入进来,方便后面将它转换为两插头
	PlugConverter(ThreePlug* threePlug)
	{
		this->threePlug = threePlug;
	}

	// 在三插头上安装转换器,使它变成两插头
	void installTheConverter()
	{
		cout << "在三插头上安装转换器成功!现在已经变为两插头!" << endl;
	}

	void twoPlugCharge()		// 执行充电
	{
		// 1. 给三插头安装转换器
		this->installTheConverter();

		// 2. 然后让三插头执行充电
		this->threePlug->threePlugCharge();
	}

protected:
	ThreePlug* threePlug;		// 维护一个三插头
};

int main()
{
	// 实例化一个三插头
	ThreePlug* threePlug = new ThreePlug;

	// 先尝试一下直接充电
	threePlug->threePlugCharge();

	// 在三插头上面安装一个转换器,将其转成两插头(即:实例化一个插头转换器)
	PlugConverter* twoPlug = new PlugConverter(threePlug);

	// 对它进行充电
	twoPlug->twoPlugCharge();


	delete threePlug;
	delete twoPlug;

	system("pause");
	return 0;
}

类适配器

#include<iostream>
#include<string>
using namespace std;

// 电源插座案例:三插头和两插头的适配
// 用户本身只有三插头
// 用户现在需要将三插头转换为两插头

// 三插头(具体)
class ThreePlug
{
public:
	void threePlugCharge()		// 执行充电
	{
		cout << "开始充电..." << endl;
	}
};

// 两插头(抽象)
class AbstractTwoPlug
{
public:
	virtual void twoPlugCharge() = 0;
	virtual ~AbstractTwoPlug() {};
};

// 两插头(具体)
class TwoPlug
{
public:
	void twoPlugCharge()		// 执行充电
	{
		cout << "开始充电..." << endl;
	}
};

// 插头转换器【适配器】(继承了两插头和三插头的功能)
class PlugConverter : public AbstractTwoPlug, public ThreePlug
{
public:
	void twoPlugCharge()		// 执行充电
	{
		// 1. 先给三插头插上转换器【适配器】
		this->installTheConverter();

		// 2. 然后让三插头执行充电
		threePlugCharge();
	}

	// 在三插头上安装转换器,使它变成两插头
	void installTheConverter()
	{
		cout << "在三插头上安装转换器成功!现在已经变为两插头!" << endl;
	}
};

int main()
{
	// 实例化一个三插头
	ThreePlug* threePlug = new ThreePlug;

	// 先尝试一下直接充电
	threePlug->threePlugCharge();

	// 实例化一个插头转换器,它内部自带三插头,但是对外显示两插头
	PlugConverter* twoPlug = new PlugConverter;

	// 对它进行充电
	twoPlug->twoPlugCharge();


	delete threePlug;
	delete twoPlug;

	system("pause");
	return 0;
}

桥接模式

#include<iostream>
#include<string>
using namespace std;

// 案例:颜色和形状搭配
//		1. 颜色有两个:红色、蓝色
//		2. 形状有两个:圆形、矩形
//	请根据以上条件,搭配出 "红色圆形"、"蓝色圆形"、"红色矩形"、"蓝色矩形"

// 颜色(抽象)
class Color
{
public:
	virtual void fillColor() = 0;
	virtual ~Color() {};
};

// 红色(具体)
class Red : public Color
{
public:
	Red() : colorType("Red") {}		// 初始化颜色
	void fillColor()
	{
		cout << "填充颜色:" << colorType << endl;
	}

private:
	string colorType;		// 记录颜色
};

// 蓝色(具体)
class Blue : public Color
{
public:
	Blue() : colorType("Blue") {}		// 初始化颜色
	void fillColor()
	{
		cout << "填充颜色:" << colorType << endl;
	}

private:
	string colorType;		// 记录颜色
};

// 形状(抽象)
class Shape
{
public:
	virtual void setColor(Color*) = 0;			// 选择红色类?还是选择蓝色类?
	virtual void generateShape() = 0;			// 生成形状 == 画出形状 + 填充颜色
	virtual ~Shape() {};

protected:
	virtual void drawShape() = 0;
	virtual void fillColor() = 0;
	Color* color;		// 记录这个"形状"所维护的"颜色对象"
};

// 圆形(具体)
class Circle : public Shape
{
public:
	Circle()
	{
		this->shapeType = "Circle";		// 初始化形状
	}

	// 选择哪个颜色的类?
	void setColor(Color* color)
	{
		this->color = color;
	}

	// 生成形状
	void generateShape()
	{
		// 1. 画出形状
		this->drawShape();

		// 2. 填充颜色
		this->fillColor();
	}

private:
	// 画出形状
	void drawShape()
	{
		cout << "绘制:" << shapeType << endl;
	}

	// 填充颜色
	void fillColor()
	{
		this->color->fillColor();		// 调用该颜色类的对象的填充颜色功能
	}

	string shapeType;	// 记录形状
};

// 矩形(具体)
class Rectangle: public Shape
{
public:
	Rectangle()
	{
		this->shapeType = "Rectangle";		// 初始化形状
	}

	// 选择哪个颜色的类?
	void setColor(Color* color)
	{
		this->color = color;
	}

	// 生成形状
	void generateShape()
	{
		// 1. 画出形状
		this->drawShape();

		// 2. 填充颜色
		this->fillColor();
	}

private:
	// 画出形状
	void drawShape()
	{
		cout << "绘制:" << shapeType << endl;
	}

	// 填充颜色
	void fillColor()
	{
		this->color->fillColor();		// 调用该颜色类的对象的填充颜色功能
	}

	string shapeType;	// 记录形状
};

int main()
{
	// ------------------------------------

	// 实例化红色
	Color* red = new Red;
	
	// 实例化蓝色
	Color* blue = new Blue;

	// 实例化圆形
	Shape* circle = new Circle;
	
	// 实例化矩形
	Shape* rectangle = new Rectangle;

	// ------------------------------------

	// 圆形设置为红色,生成红色圆形
	circle->setColor(red);
	circle->generateShape();

	// 矩形设置为蓝色,生成蓝色矩形
	rectangle->setColor(blue);
	rectangle->generateShape();

	
	delete red;
	delete blue;
	delete circle;
	delete rectangle;

	system("pause");
	return 0;
}

外观模式

#include<iostream>
#include<string>
using namespace std;

/*
	编译过程是比较复杂的,通常包含以下内容:
		- 编译器在后台进行语法分析
		- 生成中间代码	(预处理)
		- 生成汇编代码	(编译)
		- 生成机器码		(汇编)
		- 生成可执行程序	(链接)

	虽然如此,现实中 IDE(集成开发环境) 通常能够给我们提供一键编译的方法,方便了我们的开发
	下面,我们将模拟这个过程
*/

// 语法分析
class CppSyntaxAnalyzer
{
public:
	void syntaxParser()
	{
		cout << "分析语法中..." << endl;
	}
};

// 中间代码
class CppMidCode
{
public:
	void generateMidCode()
	{
		cout << "生成中间代码中..." << endl;
	}

};

// 汇编代码
class CppAssemblyCode
{
public:
	void generateAssemblyCode()
	{
		cout << "生成汇编代码中..." << endl;
	}
};

// 机器码
class CppBinaryCode
{
public:
	void generateBinaryCode()
	{
		cout << "生成机器码中..." << endl;
	}
};

// 生成可执行程序
class CppLink
{
public:
	void generateProgram()
	{
		cout << "生成可执行程序中..." << endl;
	}
};

// IDE(集成开发环境)
class IDE
{
public:
	void compile()
	{
		CppSyntaxAnalyzer sa;
		CppMidCode mc;
		CppAssemblyCode ac;
		CppBinaryCode bc;
		CppLink lk;

		sa.syntaxParser();
		mc.generateMidCode();
		ac.generateAssemblyCode();
		bc.generateBinaryCode();
		lk.generateProgram();
		cout << "程序运行中..." << endl;
	}
};


int main()
{
	IDE cppIDE;
	cppIDE.compile();	// 一键编译

	system("pause");
	return 0;
}

享元模式

#include<iostream>
#include<string>
#include<map>
#include<memory>		// 使用智能指针
using namespace std;

/*
	享元模式(Flyweight Mode)
	案例:用户访问多个相似的网站,这些相似的网站之间,有共享的部分,也有自己独有的部分
*/

// 用户类
class User
{
private:
	string username;

public:
	// 构造函数,初始化列表
	User(string name) : username(name) {}

	// 向外提供访问接口
	string getName() const { return username; }
};

// 网站(抽象)
class AbstractWebsite
{
public:
	virtual void showPage(const User& user) = 0;		// 网站为用户提供了展示页面的功能
	virtual ~AbstractWebsite() {}
};

// 网站(具体)
class Website : AbstractWebsite
{
private:
	string websiteName;

public:
	// 构造函数,初始化列表
	Website(string name) : websiteName(name) {}
	
	// 网站为用户提供了展示页面的功能
	void showPage(const User& user)
	{
		cout << "网站:" << websiteName << ",正在为用户:" << user.getName() << ",展示页面" << endl;
	}
};

// 网站工厂
class WebsiteFactory
{
private:
	map<string, shared_ptr<Website>> webMap;	// 这个Map容器"管理"和"维护"着一堆的网站 map<字符串,指向Website对象的智能指针>

public:
	// 生成网站,返回一个指向网站的智能指针
	shared_ptr<Website> generateWebsite(string websiteName)
	{
		// 判断 webMap 容器中是否存在名字为 websiteName 的网站,如果没有就创建一个
		if (webMap.find(websiteName) == webMap.end())
		{
			// make_shared<Website>(websiteName) --> 实例化一个Website对象,并将对象的 name 初始化为 websiteName,最后返回一个智能指针
			webMap.insert(make_pair(websiteName, make_shared<Website>(websiteName)));
		}
		return webMap[websiteName];		// 通过key直接返回value
	}

	// 查看网站数量
	int checkWebsiteCount()
	{
		return webMap.size();
	}
};

int main()
{
	// 实例化一个网站工厂
	shared_ptr<WebsiteFactory> webFactory = make_shared<WebsiteFactory>();		// make_shared 开辟一块内存空间,返回智能指针
	
	// 让网站工厂生成出三个网站
	shared_ptr<Website> web1 = webFactory->generateWebsite("华为官网");
	shared_ptr<Website> web2 = webFactory->generateWebsite("小米官网");
	shared_ptr<Website> web3 = webFactory->generateWebsite("腾讯官网");

	// 实例化三个用户
	shared_ptr<User> user1 = make_shared<User>("小明");
	shared_ptr<User> user2 = make_shared<User>("小帅");
	shared_ptr<User> user3 = make_shared<User>("小美");

	// 让三个网站,展示页面给三个用户看
	// showPage() 函数需要接收"用户对象"作为参数,user1 只是一个智能指针,而 *user1 才是对象
	web1->showPage(*user1);		
	web2->showPage(*user2);
	web3->showPage(*user3);

	// ... 使用智能指针,不需要手动 delete ...
	system("pause");
	return 0;
}

组合模式

#include<iostream>
#include<string>
#include<list>
using namespace std;

// 目录(抽象)
class AbstractDirectory
{
public:
	virtual void showName() = 0;							// 显示目录的名字
	virtual void add(AbstractDirectory*) = 0;				// 向目录中添加某个东西
	virtual void remove(AbstractDirectory*) = 0;			// 将某个东西从目录中移除
	virtual list<AbstractDirectory*> getChild() = 0;		// 从目录中获取某个东西(文件或目录)
	virtual ~AbstractDirectory() {}
};

// 目录(具体)
class Directory : AbstractDirectory
{
private:
	string directoryName;					// 每一个目录对象都维护着它自己的目录名字
	list<AbstractDirectory*> container;		// 每一个目录对象都维护着一个容器,里面装的实体(目录或文件)

public:
	Directory(string name) : directoryName(name) {};		// 构造函数,列表初始化

	void showName()
	{
		cout << "目录: " << directoryName << endl;
	}

	// 向目录中添加"文件对象"或者"目录对象"
	void add(AbstractDirectory* obj)
	{
		container.push_back(obj);
	}

	// 向目录中删除"文件对象"或者"目录对象"
	void remove(AbstractDirectory* obj)
	{
		container.remove(obj);
	}

	list<AbstractDirectory*> getChild()
	{
		return container;
	}
};

class File : AbstractDirectory
{
private:
	string fileName;						// 每个文件对象维护一个文件名
	list<AbstractDirectory*> container;		// 每个文件对象维护一个容器(虽然它本质上是空容器,但是为了和上面统一格式)

public:
	File(string name) : fileName(name) {}		// 构造函数,列表初始化
	void showName() { cout << "文件: " << fileName << endl; }
	void add(AbstractDirectory*) {}
	void remove(AbstractDirectory*) {}
	list<AbstractDirectory*> getChild() { return container; }
};

// 目录节点树
void showDirectoryTree(AbstractDirectory* obj, int lineWidth)
{
	list<AbstractDirectory*> container;		// 对象容器,用来装下目录或文件里面的东西
	int i = 0;
	for (int i = 0; i < lineWidth; i++)
	{
		cout << "---";
	}
	obj->showName();				// 展示当前目录或文件的名称
	container = obj->getChild();	// 获取obj里面的内容(如果obj是文件,获取的内容为空)
	if (!container.empty())			// 如果容器不为空
	{
		// 从容器里面遍历出每一个对象
		for (auto item : container)
		{
			if (item->getChild().empty())
			{
				for (int i = 0; i <= lineWidth; i++)
				{
					cout << "---";
				}
				item->showName();
			}
			else
			{
				showDirectoryTree(item, lineWidth + 1);
			}
		}
	}
}

int main()
{
	// 实例化一个目录,作为根目录
	AbstractDirectory* root = (AbstractDirectory*) new Directory("C:");

	// 实例化一个目录,作为子目录,将此目录添加到根目录里
	AbstractDirectory* directory = (AbstractDirectory*) new Directory("mydir");
	root->add(directory);

	// 实例化一个文件,并将此文件添加到根目录中
	AbstractDirectory* file1 = (AbstractDirectory*) new File("main.cpp");
	root->add(file1);

	// 实例化一个文件,并将此文件添加到子目录中
	AbstractDirectory* file2 = (AbstractDirectory*) new File("run.py");
	directory->add(file2);

	// 查看目录节点树
	showDirectoryTree(root, 5);

	
	delete root;
	delete directory;
	delete file1;
	delete file2;

	system("pause");
	return 0;
}
Agent驱动电商运营:从选品到售后的全链路革新 在当今竞争激烈的电商市场中,传统的电商运营模式面临着诸多挑战。从选品到售后,每个环节都需要大量的人力投入和专业知识。选品需要深入了解市场趋势和消费者需求,营销需要精准定位目标用户,客服需要24小时响应用户咨询。这些工作不仅耗时耗力,而且容易受到人为因素的影响,导致效率低下和成本高企。AI Agent是一种能够感知环境、做出决策并采取行动的智能系统。感知能力:能够获取和处理环境信息。决策能力:能够根据感知到的信息做出决策。行动能力:能够执行决策,对环境产生影响。学习能力。 阅读详情

相关推荐

AI写作:为AI人工智能领域赋能

AI写作技术作为自然语言处理(NLP)领域的重要应用方向,正在深刻改变内容创作的方式。系统介绍AI写作的技术原理分析主流AI写作模型的架构特点提供实践性的代码示例探讨实际应用中的关键问题展望未来发展趋势本文涵盖从基础理论到高级应用的完整知识体系,适用于希望深入了解AI写作技术的开发者和研究人员。背景介绍:建立基本概念框架核心概念:解析关键技术原理算法实现:通过代码演示具体实现数学原理:深入底层数学模型实践应用:展示真实场景案例资源推荐:提供学习路径和工具。

AI天才研究院 3052

设计模式之结构型模式

结构型模式主要用于处理类或对象的组成结构,即如何将类或对象组合成更大的结构。这些模式通常关注于对象的组合、接口的设计以及类的组合关系。通过这些模式,我们可以更灵活地设计类结构,提高代码的可复用性和可维护性。结构型模式主要用于处理类或对象的组成结构,通过组合、委托、封装等方式,提高代码的可复用性和可维护性。常见的结构型模式包括适配器模式、桥接模式、组合模式、装饰器模式、代理模式、享元模式和外观模式。每种模式都有其独特的应用场景和优点,理解并掌握这些模式可以帮助我们在实际开发中更好地设计和优化代码结构。

m0_64974617的博客 1610

ESP32小车DIY:从零搭建无线遥控智能车(附完整代码与避坑指南)

本文详细介绍了如何从零开始DIY一台基于ESP32的无线遥控智能小车。内容涵盖核心硬件选型、电路设计、低延迟ESP-NOW无线通信协议的配置与实战,以及双电机差速控制算法与PWM调速的实现。文章提供了完整的代码示例和关键的避坑指南,旨在帮助开发者快速构建稳定可靠的智能车平台,并为进一步的功能扩展奠定基础。

gamma的博客 469

结构型模式-概述

1.概述 结构型模式关注如何将现有类或对象组织在一起形成更加强大的结构。 结构型模式描述如何将类或者对象结合在一起形成更大的结构。可以描述两种不同的东西:类与类的实例(即对象),根据这一点,结构型模式可以分为类结构型模式和对象结构型模式。 1.1 类结构型模式 类结构型模式关心类的组合,可以由多个类组合成一个更大的系统,在类结构型模式中一...

云上道人的博客 789

合成孔径雷达(SAR)的常见工作模式

随着星载SAR技术研究的深入发展,单一的条带模式已经无法满足当今时代的需求,因此许多新的工作模式相继被提出。这些新模式在分辨率和测绘宽度等方面都有所提高,接下来将简要介绍几种常用的工作模式。

m0_51390495的博客 2314

河道水位标尺识别预警 yolov7

河道水位标尺识别预警系统通过python+yolov7网络模型技术,河道水位标尺识别预警算法对河道水位标尺进行实时监测,当河道水位出现异常情况时,河道水位标尺识别预警算法将自动发出警报提示后台管理人员及时采取措施。YOLO系列算法是一类典型的one-stage目标检测算法,其利用anchor box将分类与目标定位的回归问题结合起来,从而做到了高效、灵活和泛化性能好,所以在工业界也十分受欢迎。Yolo模型采用预定义预测区域的方法来完成目标检测,具体而言是将原始图像划分为 7x7=49 个网格(grid),每

燧机科技的博客 2302

设计模式 -- 结构型模式

结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。代理模式适配器模式装饰者模式桥接模式外观模式组合模式享元模式由于某些原因需要给某对象提供一个代理对象以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。

xiaotiaoza的博客 1064

ArcGIS栅格拼接全攻略:从核心原理到色彩平衡与大数据处理

在GIS数据处理中,栅格拼接是一项基础且关键的操作,其本质是将多幅具有重叠区域的栅格图像无缝整合为一张完整地图。该技术涉及空间参考统一、像元对齐与色彩融合等核心原理,是构建连续地理空间数据的基石。其技术价值在于保障数据完整性、提升可视化效果,并为后续的空间分析提供可靠底图。在遥感影像处理、数字高程模型构建及地图制图等应用场景中,高质量的拼接成果至关重要。本文聚焦于ArcGIS平台,深入解析其栅格拼接工具,并针对常见的色彩不一致与大数据量处理难题,提供了基于**色彩平衡**和**金字塔**优化的实战解决方案,

weixin_33158887的博客 262

设计模式-结构型模式总结

结构型模式:主要用于描述如何组合类和对象以获得更大的结构。

潘威威的博客 2008

autoware 激光-相机联合标定

autoware进行激光-相机联合标定 ~~~ 刚开始进行激光-相机联合标定的时候,出现了不少问题,在此记录一下整体标定流程,以防忘记。在此,特别感谢佳明师弟,在录制数据集时提供的帮助。 ~~~ 0.系统配置: Ubuntu18.04系统 ROS Melodic opencv 3.2.0 vlp-16 一.安装autoware 这部分网上教程挺多的,但我在编译的过程中仍存在不少bug,唉~_~。 二.安装calibration_camera_lidar,从a...

nuo112的博客 1万+

⭐️VMwareWorkstation17.0虚拟机搭建WindowsXP虚拟机(完整安装步骤详细图文教程)

Windows XP是微软公司研发的计算机操作系统,于2001年10月25日正式发布。其名字中“XP”的意思来自英文中的“体验”(Experience)。Windows XP使用了Luna图形用户界面和双列开始菜单,提升了系统的安全性和工作性能,提供了WiFi支持,简化了软件的安装和运行,并增加了远程桌面功能。

Python老吕的博客 1万+

结构型模式简介

结构型模式(Structural Pattern)描述如何将类或者对象组合在一起形成更大的结构,就像搭积木,可以通过简单积木的组合形成复杂的,功能更强大的结构。结构型模式可以描述两种不同的东西:类和类的实例(即对象)。根据这一点,结构型模式可以分为类结构型模式和对象结构型模式。类结构型模式关心类的组合,由多个类可以组合成一个更大的系统,在类结构型模式中一般只存在继承关系和实现关系;而对象结构型模式关

宣的专栏 1327

「深度学习之优化算法」笔记(二)优化算法的分类

但是由于生物的局限性,人们所创造出的算法也会有局限性:我们所熟知的生物都生存在三维空间,在这些环境中,影响生物生存的条件比较有限,反应到算法中就是这些算法在解决较低维度的问题时效果很好,当遇到超高维(维度>500)问题时,结果可能不容乐观,没做过实验,我也不敢乱说。当然,他们的目的不是在最佳狩猎位置集合,他们的目的是在过去的途中看是否能发现更加好的狩猎位置,去往已经到过的狩猎地点再次狩猎是没有意义的,因为每个位置获取食物的难易程度是固定的。如果他们的策略是“不跟随最优解”,那么他们的策略是什么呢?

quanzhan_King的博客 1371

结构型设计模式

结构型设计模式是一种软件设计模式,用于解决在软件设计中常见的对象组合问题。这些模式主要关注如何将类或对象结合在一起形成更大的结构,以解决系统中的复杂性和变化。

weixin_46293908的博客 1695

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

《设计模式》第三部分 结构型设计模式 第8章 结构型设计模式简介

结构型模式(Structural Pattern)描述如何将类或者对象结合在一起形成更大的结构,就像搭积木,可以通过简单积木的组合形成复杂的、功能更为强大的结构。 结构型模式可以分为类结构型模式和对象结构型模式: 类结构型模式关心类的组合,采用继承机制来组织接口和类,即由多个类可以组合成一个更大的系统,在类结构型模式中一般只存在继承关系和实现关系。 对象结构型模式关心类与对象的组合,采用组...

不问归期的博客 770

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

前端设计模式之结构型模式

结构型模式概述 结构型模式(Structural Pattern)描述如何将类或者对象结合在一起形成更大的结构,就像搭积木,可以通过简单积木的组合形成复杂的、功能更为强大的结构。 结构型模式可以分为类结构型模式和对象结构型模式: 类结构型模式关心类的组合,由多个类可以组合成一个更大的系统,在类结构型模式中一般只存在继承关系和实现关系。 对象结构型模式关心类与对象的组合,通过关联关系使得在一个类中...

祖国的小花园 252

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

设计模式之结构型模式与行为模式

设计模式中,结构型模式与行为模式,选择其中几种进行解释,附上类图与简单模拟程序

duchenlong的博客 1765

JAVA设计模式结构型模式

结构模型:适配器模型、桥接模型、过滤器模型、组合模型、装饰器模型、外观模型、享受元模型和代理模型。

JAVA领域优质创作者,基于分片网络查询方法专利发明者。 1398
上一篇: 创建型模式
下一篇: 行为型模式
code_stream
博客等级 码龄4年 1238粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值