9设计模式

设计模式包括创建型、结构型和行为型三大类,如简单工厂、工厂方法、抽象工厂、建造者、原型、适配器、桥接、组合、装饰、外观、享元、代理等模式,它们分别在对象创建、组合和交互中起到关键作用,提供灵活、可扩展的解决方案。
摘要由CSDN通过智能技术生成

设计模式

- 设计模式要素

	- 模式名称

		- (模式名称(Pattern Name)。一个助记名,它用一两个词来描述模式的问题、解决方案和效果。命名一个新的模式增加了设计词汇。设计模式允许在较高的抽象层次上进行设计。基于一个模式词乳表,就可以讨论模式并在编写文档时使用它们。模式名可以帮助人们思考,便于人们与其他人交流设计思想及设计结果。找到恰当的模式名也是设计模式工作的难点之一。

	- 问题

		- (2)问题(Problem)。间题描述了应该在何时使用模式。它解释了设计问题和问题存在的前因后果,可能描述了特定的设计问题,如怎样用对象表示算法等:也可能描述了导致不灵活设计的类或对象结构。有时候,问题部分会包括使用模式必须满足的一系列先决条件。

	- 解决方案

		- (3)解决方案(Solution)。解决方案描述了设计的组成成分、它们之间的相互关系及各自的职责和协作方式。因为模式就像一个模板,可应用于多种不同场合。所以解决方案并不描述一个特定的具体的设计或实现,而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象组合)来解决这个问题。

	- 效果

		- (4)效果(Consequences)。效果描述了模式应用的效果及使用模式应权衡的问题。尽管描述设计决策时,并不总提到模式效果,但它们对于评价设计选择和理解使用模式的代价及好处具有重要意义。软件效果大多关注对时问和空向的衡量,它们也表述了语言和实现问题。因为复用是面向对象设计的要素之一,所以模式效果包括它对系统的灵活性、扩允性或可移植性的影响,显式地列出这些效果对理解和评价这些模式很有帮助。

- 三大类型设计模式

	- 创造型设计模式(5)

	  与对象创建有关
	  
	  	创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象。
	  	随若系统演化得越米越依赖于对象复合而不是类继承,创建型模式变得更为重要。当这种情况发生时,重心从对一组周定行为的硬编码(Hard-coding)转移为定义一个较小的基本行为集,这些行为可以被组合成任意数目的更复杂的行为。这样创建有特定行为的对象要求的不仅仅是实例化一个类。
	  	在这些模式中有两个不断出现的主旋律。
	  	第一,它们都将关于该系统使用哪些具体的类的信息封装起来。
	  	第二,它们隐藏了这些类的实例是如何被创建和放在一起的。整个系统关于这些对象所知道的是山抽象类所定义的接口。
	  	因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以及何时创建这些方面给予了很大的灵活性。它们允许用结构和功能差别很大的“产品”对象配置一个系统。配置可以是静态的(即在编译时指定),也可以是动态的(在运行时)。

		- 简单工厂方法【Simple Factory】

		  简单工厂模式属创建型模式,但不属于23种设计模式之一。
		  
		  定义:定义一个工厂类,他可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类
		  在简单工厂模式中用于被创建实例的方法通常为静态(static)方法,因此简单工厂模式又被成为静态工厂方法(Static Factory Method)
		  
		  需要什么产品就传入产品对应的参数,
		  就可以获取所需要的产品对象,而无需知道其实现过程
		  
		  例如:有一家饺子店,当客户需要某种饺子时,饺子店生成对应的饺子给客户。这里就可以把饺子店看成工厂(Factory),饺子看成产品(Product),饺子的名称看成参数,饺子店根据不同的参数返回不同的饺子。
		  
		  比如:客户想要韭菜饺子,这里韭菜就是参数,
		  饺子店会根据参数韭菜返回韭菜饺子(当然饺子店有ABC饺子的前提下)
		  
		  三类角色:
		  
		  工厂(核心):负责实现创建所有产品的内部逻辑,工厂类可以被外界直接调用,创建所需对象
		  
		  抽象产品:工厂类所创建的所有对象的父类,
		  封装了产品对象的公共方法,所有的具体产品为其子类对象
		  
		  具体产品:简单工厂模式的创建目标,
		  所有被创建的对象都是某个具体类的实例。它要实现抽象产品中声明的抽象方法

			- 

				- 不属于23种之一

					- 不符合开放封闭原则,对扩展开放对修改关闭

		- 类

			- 工厂方法模式【Factory Method】

				- 意图

					- 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

				- 结构

					- 

						- 

				- 适用性

					- Factory Method模式适用于:

(1)当一个类不知道它所必须创建的对象的类的时候。
(2)当一个类希望由它的子类来指定它所创建的对象的时候。
(3)当类将创建对象的职责委托给多个帮助了类中的某一个,并且你希望将哪一个帮助在子类是代理者这一信息局部化的时候。

				- 实例

					- X工厂专产X产品

		- 对象

			- 抽象工厂模式 【Abstract Factory】

				- 意图

					- 提供一个创建【一系列】相关或和互依赖对象的接口,而无须指定它们具体的类。

				- 结构

					- 

						- 其中:

AbstractFactory声明一个创建抽象产品对象的操作接口。
ConcreteFactory实现创建具体产品对象的操作。
AbstractProduct为一类产品对象声明一个接口。
ConcreteProduct定义个将被相应的具休工厂创建的产品对象,实现AbstractProduct接口。
Client仅使用由AbstractFactory和AbstractProduct类声明的接口。

				- 适用性

					- Abstract Factory模式适用于:

(1)一个系统要独立于它的产品的创建、【组合】和表示时。(区别原型模式!)
(2)一个系统要由多个产品系列中的一个来配置时。
(3)当要强调一系列相关的产品对象的改计以使进行联合使用时。
(4)当提供一个产品类库,只想显示它们的接口而不是实现时。

				- 实例

					- X工厂产ABC一系列产品

			- 生成器模式【Builder】

				- 意图

					- 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

				- 结构

					- 

				- 适用性

					- Builder模式适用于:

(1)当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
(2)当构造过程必须允许被构造的对象有不同的表示时。

				- 实例

					- 厨师-服务员-点套餐

			- 原型模式【Prototype】

				- 意图

					- 用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。

				- 结构

					- 

				- 适用性

					- Prototype模式适用于:

(1)当一个系统应该独立于它的产品创建、【构成】和表示时。(区别抽象工厂!)
(2)当要实例化的类是在运行时刻指定时,例如,通过动态装载。
(3)为了避免创建一个与产品类层次平行的工厂类层次时。
(4)当一个类的实例只能有几个不同状态组合中的种时。建立相应数目的原型并克隆它们,可能比每次用合适的状态手工实例化该类更方便一些。

				- 实例

					- 克隆自己,拷贝复制

			- 单例模式【Singleton】

				- 意图

					- 保证一个类仅有一个实例,并提供一个访问它的全局访问点。

				- 结构

					- 

				- 适用性

					- Singleton模式适用于:

(1)当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
(2)当这个唯一实例应该是通过子类化可扩展的,并且客户无须更改代码就能使用广个扩展的实例时。

				- 实例

					- 一对一

	- 结构型设计模式(7)

	  处理类或对象的组合

		- 类

			- 适配器模式【Adapter】

				- 意图

					- 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

				- 结构

					- 

				- 适应性

					- Adapter模式适用于:

(1)想使用一个已经存在的类,而它的接口不符合要求。
(2)想创建一个可以服用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
(3)(仅适用于对象Adapter)想使用一个已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。

				- 实例

					- HDMI-VGA转接头

		- 对象

			- 适配器模式【Adapter】

				- 意图

					- 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

				- 结构

					- 

				- 适用性

					- Adapter模式适用于:

(1)想使用一个已经存在的类,而它的接口不符合要求。
(2)想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
(3)(仅适用于对象Adapter)想使用一个已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。

				- 实例

					- HDMI-VGA转接头

			- 桥接模式【Bridge】

				- 意图

					- 将抽象部分与其实现部分分离,使它们都可以独立地变化。

				- 结构

					- 

				- 适用性

					- Bridge模式适用于:

(1)不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如,这种情况可能是因为,在程序运行时刻实现部分以可以被选择或者切换。
(2)类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这是Bridge模式使得开发者可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。对一个抽象的实现部分的修改应对客户不产生影响,即客户代码不必重新编译。
(3)(C++)想对客户完全隐藏抽象的实现部分。
(4)有许多类要生成的类层次结构。
(5)想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。

				- 实例

					- M种产品-N种颜色

			- 组合模式【Composite】

				- 意图

					- 将对象组合成树型结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。

				- 结构

					- 

				- 适用性

					- Composite模式适用于:

(1)想表示对象的部分整体层次结构。
(2)希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

				- 实例

					- 文件夹-文件

			- 装饰模式【Decorator】

				- 意图

					- 动态地给一个对象添加一些额外的职责。就增加功能而言,Decorator模式比生成子类更加灵活。

				- 结构

					- 

				- 适用性

					- Decorator模式适用于:

(1)在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
(2)处理那些可以撒销的职责。
(3)当不能采用生成子类的方式进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是,由于类定义被隐藏,或类定义不能用于生成子类。

				- 实例

					- 人-学生-装饰器-添加职责

			- 外观模式【Facade】

				- 意图

					- 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

				- 结构

					- 

				- 适用性

					- Facade模式适用于:

(1)要为一个复杂子系统提供一个简单接口时,子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类,这使得子系统更具有可重用性,也更容易对子系统进行定制,但也给那些不需要定制子系统的用户带来一些使用上的困难。Facade可以提供一个简单的默认视图,这一视图对大多数用户来说己经足够,而那些需要更多的可定制性的用户可以越过Facade层。
(2)客户程序与抽象类的实现部分之间存在着很大的依赖性。引入Facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
(3)当需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,则可以让它们仅通过Facade进行通信,从而简化了它们之间的依赖关系。

				- 实例

					- 统一接口

			- 享元模式【Flyweight】

				- 意图

					- 运用共享技术有效地支持大细粒度的对象。

				- 结构

					- 

						- 

				- 适用性

					- Flyweight模式适用于:

(1)一个应用程序使用了大量的对象。
(2)完全由于使用大量的对象,造成很大的存储开销。
(3)对象的大多数状态都可变为外部状态。
(4)如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
(5)应用程序不依赖于对象标识。由于flyweight对象可以被共享,所以对于概念上明显有别的对象,标识测试将返回真值。

				- 实例

					- 围棋-棋子-颜色-位置

			- 代理模式【Proxy】

				- 意图

					- 为其他对象提供一种代理以控制对这个对象的访问。

				- 结构

					- 

						- 

				- 适用性

					- Proxy模式适用于在需要比较通用和复杂的对象指针代替简单的指针的时候,常见情况有:

(1)远程代理(Remote Proxy)为一个对象在不同地址空间提供局部代表。虚代理(Virtual Proxy)根据需要创建开销很大的对象。
(2)保护代理(Protection Proxy)控制对原始对象的访问,用于对象应该有不同的访间权限的时候。
(3)智能引用(Smart Reference)取代了简单的指针,它在访问对象时执行一些附加操作。典型用途包括:对指向实际对象的引用计数,这样当该对象没有引用时,可以被自动释放:当第一次引用一个持久对象时,将它装入内存:在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它。

				- 实例

					- 买房中介

	- 行为型设计模式(11)

	  类或对象怎样交互和怎样分配职责进行描述
	  
	  	行为模式涉及算法和对象间职责的分配。行为模式不仅描述对象或类的模式,还描述它们之间的通信模式。这些模式刻画了在运行时难以跟踪的、复杂的控制流。它们将用户的注意力从控制流转移到对象间的联系方式上来。
	  	行为类模式使用继承机制在类间分派行为。本小节包括两个这样的模式。其中Template Method较为简单和常用。模板方法是一个算法的抽象定义,它逐步地定义该算法,每一步调用一个抽象操作或一个原语操作,子类定义抽象操作以具体实现该算法。另一种行为类模式是nterpreter,它将一个文法表示为一个类层次,并实现一个解释器作为这些类的实例上的一个操作。
	  	行为对象模式使用对象复合而不是继承。一些行为对象模式描述了一组对等的对象怎样相互协作以完成其中任一个对象都无法单独完成的任务。这里一个重要的问题是对等的对象。
	  如何互相了解对方。对等对象可以保持显式的对对方的引用,但那会增加它们的耦合度。在极端情况下,每一个对象都要了解所有其他的对象。Mediator在对等对象间引入一个mediator对象以避免这种情况的出现。nediator提供了松耦合所需的间接性。
	  	Chain of Responsibility提供更松的耦合。它让用户通过一条候选对象链隐式地向一个对象发送请求。根据运行时刻情况任一候选者都可以响应相应的请求。候选者的数目是任意的,可以在运行时刻决定哪些候选者参与到链中。
	  	Observer模式定义并保持对象间的依赖关系。典型的Observer的例子是Smalltalk中的模型/视图/控制器,其中,一旦模型的状态发生变化,模型的所有视图都会得到通知。
	  	其他的行为对象模式常将行为封装在一个对象中并将请求指派给它。Strategy模式将算法封装在对象中,这样可以方便地指定和改变一个对象所使用的算法。Command模式将请求封装在对象中,这样它就可作为参数来传递,也可以被存储在历史列表中,或者以其他方式使用。State模式封装一个对象的状态,使得这个对象的状态对象变化时,该对象可改变它的行为。Visitor封装分布于多个类之间的行为,而Iterator抽象了访问和遍历一个集合中的对象的方式。

		- 类

			- 解释器模式【Interpreter】

				- 意图

					- 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子

				- 结构

					- 

				- 适用性

					- Interpreter模式适用于当有一个语言需要解释执行,并且可将该语言中的句子表示为一个抽象语法树时,以下情况效果最好:

(1)该文法简单。对于复杂的发文,文法的类层次变得庞大而无法管理。此时语法分析程序生成器这样的工具是更好的选择。它们无须构建抽象语法树即可解释表达式,这样可以节省空间还可能节省时间。
(2)效率不是一个关键问题。最高效的解释器通常不是通过直接解释语法分析树实现的,而是首先将它们转换成另一种形式。不过,即使在这种情况下,转换器仍然可用该模式实现。

				- 实例

					- 看文章查字典

			- 模板方法模式【Template Method】

				- 意图

					- 定义一个操作中的算法骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

				- 结构

					- 

				- 适用性

					- Template Method模式适用于:

(1)一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
(2)各子类中公共的行为应被提取出来并集中到一个公共父类中,以避免代码重复。
(3)控制子类扩展。模板方法旨在特定点调用“hook”操作(默认的行为,子类可以在必要时进行重定义扩展),这就只允许在这些点进行扩展。

				- 实例

					- 老师/学生:在上课、下课用同样的模板做不同的事

		- 对象

			- 责任链模式【Chain of Responsibility】

				- 意图

					- 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

				- 结构

					- 

				- 适用性

					- Chain of Responsibility模式适用于以下条件:

(1)有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
(2)想在不明确指定接收者的情况下向多个对象中的一个提交一个请求。
(3)可处理一个请求的对象集合应被动态指定。

				- 实例

					- 各级部门批请假条

			- 命令模式【Command】

				- 意图

					- 将一个请求封装为一个对象,从而使得可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

				- 结构

					- 

				- 适用性

					- (1)抽象出待执行的动作以参数化某对象。Command模式是过程语言中的回调(Callback)机制的一个面向对象的替代品。

(2)在不同的时刻指定、排列和执行请求。一个Command对象可以有一个与初始请求无关的生存期。如果一个请求的接收者可用一种与地址空间无关的方式表达,那么就可以将负责该请求的命令对象传递给另一个不同的进程并在那儿实现该请求。
(3)支持取消操作。Command的Execute操作可在实施操作前将状态存储起来,在取消操作时这个状态用来消除该操作的影响。Command接口必须添加一个Unexecute操作,该操作取消上一次Execute调用的效果。执行的命令被存储在一个历史列表中。可通过向后和向前遍历这一列表并分别调用Unexecute和Execute来实现重数不限的取消”和“重做”。
(4)支持修改日志。这样当系统崩溃时,这些修改可以被重做一遍。在Command接口中添加装载操作和存储操作,可以用来保持变动的一个一致的修改日志。从崩溃中恢复的过程包括从磁盘中重新读入记录下来的命令并用Execute操作重新执行它们。
(5)用构建在原语操作上的高层操作构造一个系统。这样一种结构在支持事务(Transaction)的信息系统中很常见。Command模式提供了对事务进行建模的方法。Command有一个公共接口,使得可以用同一种方式调用所有的事务,同时使用该模式也易于添加新事务以扩展系统。

				- 实例

					- 电视-遥控器

			- 迭代器模式【Iterator】

				- 意图

					- 提供一种方法顺序访问一个聚合对象中的各个元素,且不需要暴露该对象的内部表示。

				- 结构

					- 

				- 适用性

					- Iterator模式适用于:

(1)访问一个聚合对象的内容而无须暴露它的内部表示。
(2)支持对聚合对象的多种遍历。
(3)为遍历不同的聚合结构提供一个统一的接口。

				- 实例

					- 顺序遍历

			- 中介者模式【Mediator】

				- 意图

					- 用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

				- 结构

					- 

				- 适用性

					- Mediator模式适用于:

(1)一组对象以定义良好但是复杂的方式进行通信,产生的相互依赖关系结构混乱且难以理解。
(2)一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
(3)想定制一个分布在多个类中的行为,而又不想生成太多的子类。

				- 实例

					- 传话中转站

			- 备忘录模式【Memento】

				- 意图

					- 在不破坏封装性的前提下捕获一个对象的内部状态,并在对象之外保存这个状态。这样以后就可以将对象恢复到原先保存的状态。

				- 结构

					- 

				- 适用性

					- Memento模式适用于:

(1)必须保存一个对象在某一个时刻的(部分)状态,这样以后需要时它才能恢复到先前的状态。
(2)如果一个用接口来让其他对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。

				- 实例

					- 版本备份

			- 观察者模式【Observer】

				- 意图

					- 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依懒于它的对象都得到通知并被自动更新。

				- 结构

					- 

				- 适用性

					- Observer模式适用于:

(1)当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两者封装在独立的对象中以使它们可以各自独立地改变和复用。
(2)当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变时。当一个对象必须通知其他对象,而它又不能假定其他对象是谁,即不希望这些对象是紧耦合的。

				- 实例

					- UP主-粉丝

			- 状态模式【State】

				- 意图

					- 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

				- 结构

					- 

				- 适用性

					- State模式适用于:

(1)一个对象的行为决定于它的状态,并且它必须在运行时刻根据状态改变它的行为。
(2)一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态常用一个或多个枚举常量表示。通常,有多个操作包含这一相同的条件结构。State模式将每一个条件分支放入一个独立的类中。这使得开发者可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象独立变化。

				- 实例

					- 贩卖机-有无货-可否购买

			- 策略模式【Strategy】

				- 意图

					- 定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。此模式使得算法可以独立于使用它们的客户而变化。

				- 结构

					- 

				- 适用性

					- Strategy模式适用于:

(1)许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为米配置一个类的方法。
(2)需要使用一个算法的不同变体。例如,定义一些反映不同空间的空间时间权衡的算法。当这些变体实现为一个算法的类层次时,可以使用策略模式。
(3)算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
(4)一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现,将相关的条件分支移入它们各自的Strategy类中,以代替这些条件语句。

				- 实例

					- 计算器-加减乘除

			- 访问者模式【Visitor]

				- 意图

					- 表示一个作用于某对象结构中的各元素的操作。它允许在不改变各元素的类的前提下定义作用于这些元素的新操作。

				- 结构

					- 

						- 

				- 适用性

					- Visitor模式适用于:

(1)一个对象结构包含很多类对象,它们有不同的接口,而用户想对这些对象实施一些依赖于其具体类的操作。
(2)需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而又想要避免这些操作“污染”这些对象的类。Visitor使得用户可以将相关的操作集中起来定义在一个类中。当该对象结构被很多应用共享时,用Visitor模式让每个应用仅包含需要用到的操作。
(3)定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对所有访问者的接口,这可能需要很大的代价。如果对象结构类经常改变,那么可能还是在这些类中定义这些操作较好。

				- 实例

					- 统计老师学生群体中的平均年龄
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值