摘要:
建造者模式哦,提供了一系列的方法对产品进行处理,可以选择其中的方法进行任意组合,不过要写好建造者模式代码需要有很强的业务知识哦。最后得到相应的产品就可以了。UML图:UML图可以看到Builder中包含产品的建造和获取,Director向导来决定如何建造产品。对于Dota中Model的建造来说需要实现以下接口IBuilder,包括创建模型,增加名称,设置技能,贴图。这里没有列举全有兴趣的同学可以自... 阅读全文
摘要:
桥接模式比较简单,主要是运用了组合。UML图:本文中我虚构了一些场景,大概在Dota中不常发生吧。Dota中有5个队友,假如,我说的是假如,你的队友西瓜吃多了想要去嘘嘘,但是现在是关键,他是团控,又不能为了胜利牺牲一条内裤加裤子吧。那我们只能共享单位了,现在你可以控制自己也可以控制去嘘嘘的队友的英雄。点击哪个英雄就控制哪个,在这里就可以用到桥接了。上边说到桥接是组合,首先英雄是不能缺少的,除非已经... 阅读全文
摘要:
适配器,顾名思义是用来适配接口的,就拿我们常用的笔记本来说吧。大家都知道我们的笔记本在使用时都通过适配器连接电源,那是因为笔记本需要的电压和插座提供的电压不同,需要把插座提供的电压适配为笔记本可以接受的电压。废话不多说,UML图是必上的:适配器分为对象适配器和类适配器,由于类适配器需要用到多继承所以与C#无缘了,所以我们来研究下对象适配器。本文中将要把野怪适配为英雄,假如说现在有个英雄的接口,什么... 阅读全文
摘要:
命令模式看起来好像简单些,实际还是十分复杂的。代码比较简单,所有的Command只要继承了ICommand接口即可。 publicinterfaceICommand{objectExecute();}具体的Command类见完整代码。Command对象在构造函数中定义操作的对象,Execute方法调用构造函数中定义的对象。本示例缺少了Undo的实现,只要在执行命令时把命令记录下来,执行Undo时进... 阅读全文
摘要:
外观模式,不知道你是否会碰到这样的场景,公司要开会了,由你负责布置会场,你需要做的工作有:1.把窗帘拉下来。2.摆好椅子。3.降下投影幕布。4.打开投影仪。5...............太烦了,有时你甚至少做了一样,别怕,如果有了外观模式就可以高枕无忧了。简单的说,外观模式就是把1~5条甚至更多的操作抽象为一个操作,那就是------------开会布置在本例中,外观模式就是把游戏初始化的操作合... 阅读全文
摘要:
组合模式,本质上就是树的一种代码实现。把所有节点统一化,牺牲类的清晰性来使得遍历简化。遍历依靠迭代器,请参考迭代器一章。UML图:Composite抽象类接口如下,包含孩子节点,增加孩子节点的方法,删除孩子节点的方法,以及操作。 publicabstractclassComposite{protectedstringname;protectedArrayListchilds=newArrayLis... 阅读全文
摘要:
责任链,看到名字大概就能了解到这个模式的含义了,就是有N个责任,组成一条责任链,进行流水线作业。举个生活中的例子,比如你要请假,请假是时间比较长(十个月),你去找Leader组长,组长一看假条迷惑的说,你要去生孩子吗?这个你得去问项目经理。然后你又转战项目经理那里,项目经理看了说,你是十月请假看国庆典礼那,还是请十个月假回家休养。你肯定得告诉项目经理你要请十个月假。项目经理皱皱眉头说,这个我说了没... 阅读全文
摘要:
迭代器,将遍历集合的方法归一化,不论是ArrayList,普通数组还是其他集合类型,使得遍历集合可以统一管理。UML图:只要集合都实现了以下接口即可,当然接口函数可以包括Remove等方法,本例列举的是最基础的方法。 internalinterfaceIIterator{boolHasNext();objectNext();}也就是说所有的结合类可以判断是否有下一个元素,以及可以返回下一个元素。具... 阅读全文
摘要:
Dota中地图有那么多的树,为什么没有拖慢游戏速度那,在此就要讲讲享元模式了。享元模式将类的粒度进一步细化,FlyWeight的意思是最轻量级选手,也称蝇量模式,对于大量数量的对象来说,类将内蕴状态和外蕴状态分开,内蕴只含最少的数据,剩下的交给外蕴。保证多对象内存消耗不会过大。UML图:测试代码:DotaPatternLibrary.Flyweight.Trees trees = new Dota... 阅读全文
摘要:
观察者在生活中最显而易见的例子就是报纸订阅了,此时报纸内容是主体,而每个花钱订阅的家庭就都是观察者。当你订阅时报纸出版商会将报纸按时发到你的订报箱,当你停止订阅是你的订报箱将会是空的,当然你随时可以订阅或取消订阅。UML图:观察者模式对主题信息的处理方式分两种,“推模式”和“拉模式”。framework中最明显的观察者模式要算是事件了,你可以使用... 阅读全文
摘要:
原型模式,说白了就是拷贝新对象,新对象是原来的对象一模一样。就像是孙悟空用毛吹出的N个孙悟空一样,他们都是一样的具有一样的状态。UML图:在C#中原型模式就是要实现Clone方法,完成对对象的拷贝,framework中已经有了这个接口我们不必去重新定义了(ICloneable)。C#中分为深拷贝和浅拷贝,浅拷贝这样实现即可: publicobjectClone(){returnthis.Membe... 阅读全文
摘要:
备忘录模式,最直接的就是记录游戏进度了,如果有个18关的游戏不能记录游戏进度,每次都必须从第一关开始玩,那你是不是要放弃游戏了,我肯定会的,嘿嘿。在C#中序列化使我们能够更方便的完成备忘录模式,UML图先给大家一个概念:具体代码见完整代码。测试代码: DotaPatternLibrary.Memento.Game game = new DotaPatternLibrary.Memento.Game... 阅读全文
摘要:
代理模式分为好多中,什么透明代理啦,远程代理啦,安全代理啦,本文介绍的是最基本的代理。UML图:真正的对象和代理对象均继承相同的接口,实例化代理对象时将真实对象传入,当操作代理对象时感觉像是在操作真正对象一样。像是代理对象把真正的对象包装后再在客户端处理。 internalinterfaceISubject{voidDeal();}关键在代理类的构造函数中实现对真正对象的实例化,在类的成员方法中操... 阅读全文
摘要:
单件模式,单件意味着唯一,我们创建的类的实例是唯一的。唯一的处理打印机,消息队列,注册表等等.......UML图:单件模式看来简单,其实不然。包括什么双重加锁(多线程要求),延迟实例化等等,具体在TerryLee的blog上有详细的描述,本文不再罗嗦。单件模式没有公开的构造函数,要实现对象的实例化只能依靠静态的GetInstance方法。在GetInstance方法中判断对象是否存在,存在则返回... 阅读全文
摘要:
模板方法比较简单,实际上就是在一个抽象类中写N个方法,其中包括abstract方法和已经实现的方法。模板方法就是已经实现的方法,而abstract方法是交由子类实现的。UML图:本文中的例子是创建Dota模型的例子,英雄和等级低的野怪有什么区别?区别在英雄有技能,等级低的野怪没有技能。下面会是创建模型的过程:CreateModel(创建3D模型)->SetSkill(设置技能)->Se... 阅读全文
摘要:
策略模式,是算法族的集合,将算法抽象出接口,并根据接口实现各种算法。在使用算法的具体类中设置相应的算法,为什么有策略模式的诞生,建议大家看下Headfirst,里边的介绍是相当的详细,看完后保证有茅塞顿开的感觉。UML图:策略模式中讲究的是组合,算法族的建立。本文的算法族是英雄的行动IAction接口。Dota中的英雄有走着的,有飞行的,有爬行的。分别写行走类,飞行类,爬行类继承IAction接口... 阅读全文
摘要:
抽象工厂模式即工厂方法模式的集合。工厂方法得到一种产品,而抽象工厂模式得到一系列产品。同样先来UML来个总体认识:一、抽象工厂类抽象工厂是GameFactory,它生产两种产品(英雄,建筑。当然包括更多,本文只给出两种)。 ///<summary>///抽象工厂///</summary>publicabstractclassGameFactory{publicabstrac... 阅读全文
摘要:
工厂方法,特征就是“方法”上,由子类实现父类的抽象方法,把创建产品的责任转移到子类中。先上UML图:还是以Dota游戏为例,我们的工厂是Dota中创建模型的工厂,而产品则是不同的模型。首先我们要明确需求,Dota中需要创建N中Model,包括英雄、野怪、树木等那么我们的产品类如下:[代码]细心的Dotaer已经看到,产品父类包含一个接口ISkill,这个代表技能。技能的接口... 阅读全文
摘要:
发表了两篇文章,没有发到首页上,没想到访问量这么低,汗啊..........不过既然要写还是写完吧,看来Dota的队伍不够大呃。当作我自己总结了这篇是简单工厂,实际上简单工厂不是Gof的23个设计模式一员,但是还是有必要说说滴,先来个UML图吧:设计模式的目标是解耦,把变化的部分各类来,本次Dota的例子是选择游戏类型的命令(-ap,-ar,-rd等等)。首先我们有命令对象,如下所示:[代码]RD... 阅读全文