大话设计模式

大话设计模式笔记(二十四)の解释器模式

馋奶兔 提交于 2019-12-15 17:31:55
解释器模式 定义 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 目的 如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。 UML图 好处 容易改变和扩展文法,因为该模式使用类来表示文法规则,你可使用继承来改变或扩展该文法。也比较容易实现文法,因为定义抽象语法树中各个节点的类的实现大体类似,这些类都易于直接编写。 不足 解释器模式为文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护。建议当文法非常复杂时,使用其他的技术如语法分析或编译器生成器来处理。 举个栗子 实现一个简单的音乐解释器。规则大致有:“C D E F G A B”分别表示“Do-Re-Mi-Fa-So-La-Ti”;音符长度1表示一拍,2表示二拍,0.5表示半拍,0.25表示四分之一拍,以此类推。解释以下《上海滩》 Talk is cheap, show me the code (屁话少说,放码过来) /** * 演奏内容类 * Created by callmeDevil on 2019/12/15. */ public class PlayContext { // 演奏文本 private String text; // 省略

《大话设计模式》之简单工厂模式

寵の児 提交于 2019-12-04 17:49:36
问题背景:   编程初学者都会有这样的问题,碰到问题就直觉地用计算机能够理解的逻辑来描述待解决的问题以及具体的求解过程,但这样的程序只为满足当前的需求,不容易维护和拓展。 问题解决思路: 设计一段代码之前,首先需要考虑到其 可维护 、 可拓展性 ; 将 面向对象特性 充分融入到代码设计过程中; calculator.h #ifndef _CALCULATOR_H_ #define _CALCULATOR_H_ #include <string> struct Calculator { Calculator() = default; Calculator(double lNum, double rNum) :leftNumber(lNum), rightNumber(rNum), result(0){} ~Calculator(){} virtual double getResult() = 0; //基类中可实现也可不实现 protected: double leftNumber; double rightNumber; double result; }; /* 关于继承方式: public -- 属性不变 protected -- public变成protected private -- 都变成private */ class CalculatorAdd :public

《大话设计模式》策略模式

佐手、 提交于 2019-11-28 09:39:44
首先介绍一下策略模式的定义,如果看不大懂这个专业术语定义没关系,继续往下看,你就会明白啦。 策略模式(Strategy):它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。 接下来先给大家看一下 策略模式的结构图: Context上下文,用一个ConcreateStrategy来配置,维护一个对Strategy对象的引用;ConcreteStrategyA,ConcreteStrategyB,ConcreteStrategyC为具体策略类,封装了具体的算法或行为,继承Strategy。 Strategy类:定义所有支持的算法的公共接口 //抽象算法类 abstract class Strategy { //算法方法 public abstract void AlgorithmInterface ( ) ; } ConcreteStrategy,封装了具体的算法或行为,继承于Strategy class ConcreteStrategyA : Strategy { //算法 A 实现方法 public override void AlgorithmInterface() { Console . WriteLine ( "算法A实现" ) ; } } class ConcreteStrategyB : Strategy { //算法

大话设计模式之原型模式

浪尽此生 提交于 2019-11-27 23:34:21
原型模式 定义: 用原型实例制定创建对象的种类,并通过拷贝这些原型,创建新的对象。 实质: 就是从一个对象在创建另一个可定制的对象,而且不需要知道任何创建的细节。 核心: (1)、实现Cloneable接口,可以使用此接口的类上使用clone方法。 (2)、重写Object类中的clone方法,因为所有类的父类是Object类,Object有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此,将clone改为public类型。 结构图: 代码实现: class Resume : ICloneable//实现ICloneable接口 { private string name; private string computer; public Resume(string name) { this.name = name; } public void SetWordExperience(string computer) { this.computer = computer; } public void Display() { Console.WriteLine("{0}", name); Console.WriteLine("工作经历: {0}", computer); } public Object Clone()/

Java学习建议

≡放荡痞女 提交于 2019-11-27 19:03:31
对于Java程序猿学习的建议      这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是LZ你是如何学习Java的,能不能给点建议?   今天LZ是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容甚至是一些书籍。这一部分的内容,同样适用于一些希望转行到Java的同学。   在大家看之前,LZ要先声明两点。   1、由于LZ本人是Java后端开发出身,因此所推荐的学习内容是Java Web和Java后端开发的路线,非Java Web和Java后端开发的同学请适当参考其学习思想即可,切勿照搬。   2、下面对于【第一部分】的推荐内容,目的是让你尽快成为一个可以参加工作的Java开发者,更适用于处于待业状态,准备转行Java的同学。如果你是在校学生,务必要在学好基础(比如计算机系统、算法、编译原理等等)的前提下,再考虑去进行下面的学习。      第一部分:对于尚未做过Java工作的同学,包括一些在校生以及刚准备转行Java的同学。   一、Java基础   首先去找一个Java的基础教程学一下,这里可以推荐一个地址,或者你也可以参照这个地址上去找相应的视频,地址为 http://www.runoob.com/java/java-tutorial.html 。   学习Java基础的时候,应该尽量多动手,很多时候

大话设计模式笔记(十七)の迭代器模式

一笑奈何 提交于 2019-11-27 15:34:31
迭代器模式 定义 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。 什么时候用? 当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式 。 你需要对聚集有多种方式遍历时,可以考虑用迭代器模式。 UML图 模板代码 Aggregate /** * 聚集抽象类 * Created by callmeDevil on 2019/8/17. */ public abstract class Aggregate { // 创建迭代器 public abstract Iterator createIterator(); } Iterator /** * 迭代器抽象类 * Created by callmeDevil on 2019/8/17. */ public abstract class Iterator { // 用于定义得到开始对象、得到下一对象、判断是否到结尾、当前对象等抽象方法 public abstract Object first(); public abstract Object next(); public abstract boolean isDone(); public abstract Object currentItem(); } ConcreteAggregate /** * 具体聚集类 *

大话设计模式笔记(十五)の备忘录模式

安稳与你 提交于 2019-11-26 23:31:06
举个栗子 问题描述 打游戏存进度。 简单实现 GameRole /** * 游戏角色 * Created by callmeDevil on 2019/8/11. */ public class GameRole { // 生命力 private int vit; // 攻击力 private int atk; // 防御力 private int def; // 状态显示 public void stateDisplay() { System.out.println("角色当前状态:"); System.out.println(String.format("体力:%s", this.vit)); System.out.println(String.format("攻击力:%s", this.atk)); System.out.println(String.format("防御力:%s", this.def)); System.out.println(); } // 获得初始状态 public void getInitState() { // 数据通常来自本机磁盘或远程数据库 this.vit = 100; this.atk = 100; this.def = 100; } // 战斗 public void fight(){ // 在与Boss大战后游戏数据损耗为0 this