定义 策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 Strategy 模式典型的结构图为: 大家肯定看着很懵逼,其实第一次接触类图的时候我自己也是这样。 那么咱们举个例子来解释一下。 假设我们要实现一个角色游戏,context为所有角色的基类(例子的代码后面会实现,此处只是拿context举例,此处的context并不是基类),一个角色可以切换不同的武器。然后strategy则为不同的武器的基类,而不同的武器的攻击方式是不同的,斧头的攻击为砍,剑的攻击为刺,弓箭的话为射击。乍一看感觉好麻烦啊。难不成得给一个角色类把所有的武器类都包含进去,然后切换武器的时候删除掉之前的武器,然后再重新开辟一个新的武器类。这样子的话给我们设计会带来非常大的不方便。而且假如我们有了新的武器,比如魔法棒,那么我们不是应该给角色类里面再添加魔法棒类,这样的话会让角色类变得非常庞大,而且非常不利于后期的维护,我们不能每增加一个武器就给角色类添加一个武器类吧。所 继续阅读 >>


李佳灏 18/06/22 23:47:23
策略模式 定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。 OO(Object Oriented)面向对象 基础:抽象、封装、多态、继承 原则: 找出应用中可能需要变化之处,把它们独立出来。 针对接口编程,而不是针对实现编程。 多用组合,少用继承。 观察者模式 定义了对象间的一对多依赖,这样一来,当一个对象改变时,它的所有依赖者都会收到通知并自动更新。 主题(可观察者)用一个共同的接口来更新观察者。 观察者和可观察者之间用松耦合方式结合,可观察者不知道观察者的细节,只知道观察者实现了观察者接口。我们可以独立地复用主题或者观察者,改变主题或者观察者其中一方,不会影响另一方。 可以从被观察者处推(push)或者拉(pull)数据。(推的方式更好) 有多个观察者时,不可以依赖特定的通知次序。 Java有多种观察者模式的实现,包括通用的java.util.Observable,但要注意它是一个类,限制了它的使用和复用。如果有必要,可 继续阅读 >>


李猛 18/04/18 23:21:50
观察者模式是JDK中使用最多的设计模式之一. 在学习观察者模式之前, 我在网上也找了很多博客, 这些博客都是的讲解都是基于 head first 设计模式 这本书的. 如果看书的话, 很简单就能学会这个设计模式, 但是将书上的内容些成博客, 其实是不太容易理解的. 所以在这篇博客中, 我将用我自己的方式以示例的方式来讲解这个设计模式. 1. 观察者模式是什么? 它解决了什么问题? (1) 观察者模式是什么? 观察者模式由两个端组成, 分别是通知者(speaker)和观察者(listener). 观察者也可以称为监听者. speaker和Listener是一对多的关系. 当speaker的状态发生改变时, 可以将这种改变通知给它所有的Listener. (2) 解决了什么问题? 假如现在speaker里面做了某些操作后, 它需要将这些操作的结果(或者某些数据)告诉它所有的listener, 最容易想到的办法就是通过方法调用来实现, 但是这样就使得这多个listener和spea 继续阅读 >>


祝一迪 18/02/05 00:30:20
1. 意图 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 2. 动机 对一些类来说,只有一个实例是很重要的。虽然系统中可以有许多打印机,但却只应该有一个打印假脱机( printer spooler),只应该有一个文件系统和一个窗口管理器。一个数字滤波器只能有一个 A / D转换器。一个会计系统只能专用于一个公司。 我们怎么样才能保证一个类只有一个实例并且这个实例易于被访问呢?一个全局变量使得一个对象可以被访问,inng kk。 一个更好的办法是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建(通过截取创建新对象的请求),并且它可以提供一个访问该实例的方法。这就是Singleton模式。 3. 适用性 在下面的情况下可以使用 S i n g l e t o n模式 - 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。 - 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。 4. 结构 5. 参与者 定义一个 I n s t a n c 继续阅读 >>


楚东方 17/07/31 08:59:39
通常,I/O复用机制都需要事件分享器。分享器对象可将来自事件源的I/O事件分离出来,并分发到对应的Read/Write事件处理器。开发人员预先注册需要处理的事件及该事件对应的事件处理器。 Reactor和Proactor都涉及到了事件分享器,不同的是,Reactor是基于同步I/O的,而Proactor是与异步I/O相关。 在Reactor模式中,事件分离器等待某个事件或者某个操作的状态发生,比如文件描述符可读写或是socket可读写,事件分离器就将这个时间传给事先注册的事件处理器(事件处理函数或者回调函数),由后者来做实际的读写操作。 而在Proactor模式中,事件处理器直接发起一个异步读写操作,发起时,需要提供用于存放读到数据的缓存区、读的数据大小。以及这个请求完成后的回调函数等信息。事件分离器收到请求后,默默等待这个请求的完成,然后转发完成事件给对应的事件处理器。这种异步模式的典型实现是基于操作系统底层异步API的,所以我们可以称之为“系统级别”的或者“真正意义上”的异步,因为具体的读写操 继续阅读 >>


师毅 17/03/01 18:40:34
一:工厂模式 将实例化具体类的过程交给工厂,你只用告诉它你需要什么样的类型就好了。 比如下面这段代码: Fruit createFruit(string name) { Fruit fruit; -------------------------------- if(name == "Apple") { fruit = new Apple(); } else if(name == "Banana") { fruit = new Banana(); } else if(name == "peach") { fruit = peach(); } --------------------------------- fruit.cut(); //将水果切块 fruit.box(); //将水果装盒 return fruit; } 如果我将上面代码片段中两条横线之间的代码实现为另一个方法叫Fru 继续阅读 >>


杨博东 16/12/06 20:43:55
一:装饰者模式 将最初的对象用一层一层外衣(修饰者)包装起来,实现自由组合。 举个栗子: 最初的对象:咖啡 外衣:糖,牛奶,豆浆… 我可以将上面的类型自由组合,比如 咖啡加糖和牛奶 或者 咖啡加豆浆 或者 咖啡加糖和豆浆 或者 ...。 二:不使用装饰者模式 实现上面的栗子,如果没有使用装饰者模式,类图可能是这样: 缺点非常明显: 有多少种组合就必须自己实现多少个子类 设计子类时必须严格考虑,比如没有人在咖啡中加牛奶又加豆浆 子类的cost()方法实现具体价格的计算,那要是牛奶价格上升,调整与牛奶相关的每一个子类中的cost()方法将会使你奔溃。 三:使用装饰者模式 基本原则是我们定义一种公共类型A,每个A中有相同的方法,参数都是同一种类型A,这样我们可以一层一层在原始咖啡上加东西。假设像下面这样调用我就能返回相应的价格。 CoffeeWithMilk = new Milk(new Coffee()); //CoffeeWithMilk.cost() 就能返回`咖啡加牛奶`价格 再来个稍微复杂的 CoffeeW 继续阅读 >>


杨博东 16/12/01 11:34:31
一:装饰者模式 将最初的对象用一层一层外衣(修饰者)包装起来,实现自由组合。 举个栗子: 最初的对象:咖啡 外衣:糖,牛奶,豆浆… 我可以将上面的类型自由组合,比如 咖啡加糖和牛奶 或者 咖啡加豆浆 或者 咖啡加糖和豆浆 或者 ...。 二:不使用装饰者模式 实现上面的栗子,如果没有使用装饰者模式,类图可能是这样: 缺点非常明显: 有多少种组合就必须自己实现多少个子类 设计子类时必须严格考虑,比如没有人在咖啡中加牛奶又加豆浆 子类的cost()方法实现具体价格的计算,那要是牛奶价格上升,调整与牛奶相关的每一个子类中的cost()方法将会使你奔溃。 三:使用装饰者模式 基本原则是我们定义一种公共类型A,每个A中有相同的方法,参数都是同一种类型A,这样我们可以一层一层在原始咖啡上加东西。假设像下面这样调用我就能返回相应的价格。 CoffeeWithMilk = new Milk(new Coffee()); //CoffeeWithMilk.cost() 就能返回`咖啡加牛奶`价格 再来个稍微复杂的 CoffeeW 继续阅读 >>


杨博东 16/12/01 11:33:09
一:观察者模式 定义一对多(1:n)的对象关系,如果1发生变化,那么n都会收到通知,这叫观察者模式。当然,我觉得叫”出版者——订阅者”模式更加容易理解。就像你在报社订了报纸,只要报社有新报纸出版,送报员就会给你家送一份,如果不想要,还可以退定。 二:来个栗子 举一个Head First书上的栗子: 首先这是一个气象局的显示系统,WeatherData是数据的来源,Subject是一个公共基础主题,Observer是观察者的父类。WeatherData的数据如果更新,我希望forecastObserver这个面板上的数据也更新,为了使结构简单,我没有添加xObserver和yObserver等其他的Observer,但是并不代表它们不存在(实际上是可以任意扩展的)。 当然,在系统中,WeatherData也只是数据变化的一部分,如果有两部分或者更多,我们可以继续有OtherData...,让它继承自Subject就好了。Subject中定义的方法addObserver可以被forecastObserver显式的调用将自己添加到WeatherData 继续阅读 >>


杨博东 16/11/30 16:28:43
我慢慢的开始对于一些概念给出我自己的定义,而不是去搬一些“标准”或“书”,因为一个是当我发现我之前写的博客凡是“抄”过书上的到现在我仍然需要查之外,还有一个原因是我也慢慢开始找到自己学习的方法。所以如果我的定义和概念和标准不一样,请您批判着看。另外需要注意评论,我后面很可能补充一些东西或者纠正一些东西。 一:策略模式 对于同一个功能的不同实现(比如鸭子的“叫声”有“呱呱叫”还有“嘎嘎叫”),将他们分别用不同的类实现。 二: 什么意思? 举个栗子,我们想做一个“鸭子”的系统,用来表示世界上所有的鸭子,鸭子基本上都会游泳;鸭子有的会飞,有的不会飞;有的嘎嘎叫,有的呱呱叫;有的羽毛是白色,有的羽毛是黑色…… 如果你能想到可以定义一个鸭子的父类,将公共属性集合到一起,那么很好,你已经有面向对象的基本思想了,我们可以这么干: abstract class Duck { swim(); { //实现 }; //游泳 abstract quack(); //叫的方法不一样,让鸭子各自实现 abstract 继续阅读 >>


杨博东 16/11/29 19:05:24