java蝇量模式_Head First设计模式——蝇量和解释器模式

蝇量

蝇量模式:如果让某个类的一个实例能用来提供许多“虚拟实例”,就使用蝇量模式。

在一个设计房子的平台中,周围要加上一些树,树有一个坐标XY坐标位置,而且可以根据树的年龄动态将自己绘制出来。如果我们创建许多树之后,会有许多树的实例对象。使用一个树实例和一个客户对象来维护“所有”树的状态,这就是蝇量模式。

设计类图:

2a67868b344a86474ea3fcde7a545f02.png

实现代码:

①创建一个存储树状态的类

1 public class TreeState

{

public int X { get; set; }

public int Y { get; set; }

public int Age { get; set; }

}

②创建一个没有状态的树对象

1 public class Tree

{

public void Display(int x, int y, int age) {

Console.WriteLine($"坐标:{x},{y} 树龄:{age}");

}

}

③创建管理对象

1 public class TreeManager

{

List treeArray;

private Tree treeObj;

public TreeManager(List trees) {

treeArray = trees;

treeObj = new Tree();

}

public void DispalyTress() {

foreach (var tree in treeArray)

{

treeObj.Display(tree.X, tree.Y, tree.Age);

}

}

}

优点:

1、减少运行时对象实例的个数,节省内存。

2、将许多”虚拟“对象的状态集中管理。

用途和缺点:

1、当一个类有许多的实例,而这些实例能够被统一方法控制,我们就可以使用蝇量模式。

2、蝇量的缺点在于一旦你实现了它,单个实例无法拥有独立而不同的行为。

解释器

解释器模式:为语言创建解释器

给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。每个语法规则都用一个类代表。请特别留意,类直接映射到语法。

一般书中讲解的模式不一定在我们使用的时候需要完全照搬,可以多些对应的解释器类都是合理的。

类图:

dda604a435143cd07e607fd4f77339fb.png

示例代码:

①抽象类

1 public interface Expression

{

///

/// 解释方法

///

///

///

public Object interpret(String input);

}

②终结符表达式类

1 public class TerminalExpression : Expression

{

public object interpret(string input)

{

//对终结符表达式的解析

return null;

}

}

③非终结表达式类

1 public class NonterminalExpression : Expression

{

private Expression exp1;

private Expression exp2;

public Object interpret(string input)

{

//非终结符表达式的解析处理

return null;

}

}

④上下文类

1 public class Context

{

private Expression exp;

public Context()

{

//数据初始化或者对象等

}

public void operation(string input)

{

//解析语句操作

}

}

优点:

1、将每一个语法规则表示成一个类,方便于实现语言。

2、因为语法由许多类表示,所以可以轻易地改变或扩展语言。

3、通过在类结构中加入新方法,可以在解释的同时增加新行为,例如打印格式美化或进行复杂程序验证。

用途和缺点:

1、当需要实现一个简单的语言时,使用解释器。

2、可以处理脚本语言和编程语言。

3、当语法数目太大太复杂时,这个模式会变得繁杂。

b739ec46bb5c46d9c0aa4ce35ba1ea56.png

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[Head First设计模式——蝇量和解释器模式]http://www.zyiz.net/tech/detail-118645.html

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

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

相关文章

如何运用领域驱动设计 - 聚合

概述DDD实战与进阶 - 值对象如何运用DDD - 实体如何运用领域驱动设计 - 领域服务在前几篇的博文中,我们已经学习到了如何运用实体和值对象。随着我们所在领域的不断深入,领域模型变得逐渐清晰,我们已经建立了足够丰富的实体和值对象。但随着实…

C++菱形继承

菱形继承概念: 1.两个派生类继承同一个基类 2.又有某个类同时继承着两个派生类 这种继承被称为菱形继承,或者钻石继承 举个例子: 菱形继承问题: 1.羊继承了动物的数据,鸵同样继承了动物的数据,当羊驼使…

ASP.NET Core Web程序托管到Windows 服务

前言在 .NET Core 3.1和WorkerServices构建Windows服务 我们也看到了,如何将workerservices构建成服务,那么本篇文章我们再来看看如何将web应用程序托管到我们的服务中.将WEB应用作为服务运行我们需要将我们的WEB应用程序编译成exe文件,在ASP.NETCore中其实这是一个…

运行wordcount.java_运行hadoop wordcount程序

我正在通过以下michael-noll教程学习hadoop . 当我试图通过运行 hadoop jar hadoop-examples-1.2.1.jar wordcount tmp/Files tmp/Output 运行wordcount示例时,我收到以下错误:13/11/10 18:09:42 INFO ipc.Client:重试连接到服务器&#xff1…

EntityFramework Core动态加载模型,我们要知道些什么呢?

这篇文章源于一位问我的童鞋:在EntityFramework Core中如何动态加载模型呢?在学习EntityFramwork时关于这个问题已有对应童鞋给出答案,故没有过多研究,虽然最后解决了这位童鞋提出的问题,但是当我再次深入研究时&#…

C++多态的基本语法与原理剖析

多态分为两类 1.静态多态:函数重载和运算符重载属于静态多态,复用函数名 2.动态多态:派生类和虚函数实现运行时多态 静态多态和动态多态区别: 1.静态多态的函数地址早绑定,编译阶段确定函数地址 2.多态多态的函数地址…

从零开始开发 VS Code 插件之 Translator Helper

本文目录Translator Helper 介绍开发概述创建第一个VS Code Extension需求分析操作文本调用Google Translation API实现核心功能配置命令插件配置测试插件打包插件发布插件CI/CDIcon及README小结Translator Helper 介绍 微软 Docs 网站上线之后,我发现很多中文内容是…

java printf 版本_java – PrintStream类型中的printf(String,Object ...

为什么通过简单调用printf会出现以下编译错误?我的代码:import java.util.Scanner;public class TestCodeBankAccInputs{public static void main(String[] args){String displayName "Bank of America Checking";int balance 100;System.ou…

C++string容器-构造函数

本质: string是C风格的字符串,而string本质上是一个类 string和char区别: 1.char是一个指针 2.string是一个类,类内部封装了char*,管理这个字符串,是一个char*型的容器 string构造函数原型: 1…

【实战 Ids4】║ 又一个项目迁移完成(MVC)

迎周一,腊月十九,小年倒计时新年还有两周时间就要到了,学习可不能停,这几天一直在加班调休,周末也如此,不过也是趁着半夜凌晨的时间,继续迁移我的项目到IdentityServer4统一认证授权中心Blog.Id…

C++string容器-赋值操作

功能描述&#xff1a; 给string字符串进行赋值 代码如下&#xff1a; #include <iostream> using namespace std; #include <cstring>void test01() {string str1;str1 "hello world";cout << "str1 " << str1 << endl;…

C++生成随机数

C中生成随机数常用这两个函数&#xff1a; rand()和srand() rand()函数&#xff0c;生成一个范围在[0,RAND_MAX]的随机数&#xff0c;RAND_MAX的值为32767 其中RAND_MAX定义在cstdlib头文件中。 #include <iostream> using namespace std; #include <cstdlib>in…

JAVA解决生产消费者_Java常用三种方式解决生产者消费者问题(详细)

package test;/*** Synchronized 版本解决生产者消费者* wait() / notify()方法*/import java.util.LinkedList;import java.util.Queue;public class ProducerAndConsumerForSynchronized {// 1. 先定义最大生产长度private final int MAX_SIZE 10;// 2.定义储存队列private …

为什么说云原生会成为未来企业技术变迁的趋势

云原生是当下的热点话题&#xff0c;但是很多人对云原生有很多误解&#xff0c;特别是传统产业物联网或工控、物联网行业对云原生显得"后知后觉"。与其在这里说是预测&#xff0c;不如说是现在进行时&#xff0c;只是由于传统产业本身的技术包袱和组织个人认识程度差…

C++vector容器-构造函数

vector数据结构和数组非常相似&#xff0c;也称为单端数组&#xff0c;在数组的尾段可以做插入&#xff0c;删除操作 vector不同于普通数组&#xff0c;vector可以动态扩展 动态扩展&#xff1a;并不是在原空间之后续接新空间&#xff0c;而是找更大的内存空间&#xff0c;然…

java对象类型转换分为_java-如何将类对象转换为通用对象类型?

我正在研究一种使用NamedParameterJdbcTemplate从MySQL数据库获取一些数据的方法. listCurrentRecords应该从数据库返回Customer,Product和SalesOrder的对象类型列表. objectType是从在方法(1 || 2 || 3)内传递的参数定义的,并且在类中更早地定义为public变量.public static fi…

BeetleX网关之请求聚合

在网关服务中请求聚合是允许把多个请求打包成一个响应给请求方&#xff0c;这样不仅可以节省请求方的请求数量&#xff0c;还可以根据需求的情况整合不同业务数据响应请求。BeetleX.Bumblebee虽然并没有内置这一功能&#xff0c;但可以通过扩展的形式来支持请求聚合&#xff0c…

C++vector容器-赋值操作

vector赋值操作 功能描述&#xff1a; 给vector容器进行赋值 函数原型&#xff1a; 代码如下&#xff1a; #include <iostream> using namespace std; #include <vector> //vector赋值操作void printVector(vector<int> &v) {for (vector<int >…

java 计算i 出现的次数_JAVA算法:按照给定的段落统计单词出现次数(JAVA代码)...

https://blog.csdn.net/seagal890/article/details/92067644JAVA算法&#xff1a;按照给定的段落统计单词出现次数(JAVA代码)写一个 JAVA程序以统计一个文本文件 words.txt 中每个单词出现的频率。为了简单起见&#xff0c;你可以假设&#xff1a;words.txt只包括小写字母和 …

EntityFramework Core表名原理解析,让我来,揭开你神秘的面纱

上一节我们针对最开始抛出的异常只是进行了浅尝辄止的解析&#xff0c;是不是有点意犹未尽的感觉&#xff0c;是的&#xff0c;我也有这种感觉&#xff0c;看到这里相信您和我会有一些疑惑&#xff0c;要是我们接下来通过注解、Fluent APi、DbSet分别对表名进行如下设置&#x…