ruby设计模式(大话设计模式)

1、简单工厂模式
2、策略模式
3、单一职责原则
4、开放-封闭原则
5、依赖倒转原则
8、工厂方法模式

1、简单工厂模式
降低耦合度的方式包括封装、继承和多态。下面介绍各个的抽象解释

封装:通过实现一个类
继承:子类继承父类
多态:同一个方法实现不同的功能

简单工厂模式是指用一个单独的类来实现创造实例的过程。下面是一个计算器的实现。代码如下所示,在下面的代码中,通过OperationFactory类来实现对象创造的过程,如果要增加一个计算方法,只要增加一个Operation的子类,以及增加相应的case表达式。

#运算类
class Operation
  attr_accessor :number_a,:number_b

  def initialize(number_a = nil, number_b = nil)
    @number_a = number_a
    @number_b = number_b
  end

  def result
  end
end

#加法类
class OperationAdd < Operation
  def result
    number_a + number_b
  end
end

#减法类
class OperationSub < Operation
  def result
    number_a - number_b
  end
end

#乘法类
class OperationMul < Operation
  def result
    number_a * number_b
  end
end

#除法类
class OperationDiv < Operation
  def result
    raise '除数不能为0' if number_b == 0
    number_a / number_b
  end
end

#工厂类
class OperationFactory
  def self.create_operate(operate)
    case operate
    when '+'
      OperationAdd.new()
    when '-'
      OperationSub.new()
    when '*'
      OperationMul.new()
    when '/'
      OperationDiv.new()
    end
  end
end

oper = OperationFactory.create_operate('/')
oper.number_a = 1
oper.number_b = 1
p oper.result

2、策略模式
是用来封装算法的。选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象,比如下面的例子中的CashContent的对象,下面的代码是工厂模式和策略模式的结合使用。

class CashSuper
  def accept_cash(money)
  end
end

#正常收费子类
class CashNormal < CashSuper
  def accept_cash(money)
    money
  end
end

#打折收费子类
class CashRebate < CashSuper
  attr_accessor :mony_rebate

  def initialize(mony_rebate)
    @mony_rebate = mony_rebate
  end

  def accept_cash(money)
    money * mony_rebate
  end
end

#返利收费子类
class CashReturn < CashSuper
  attr_accessor :mony_condition, :mony_return

  def initialize(mony_condition, mony_return)
    @mony_condition = mony_condition
    @mony_return = mony_return
  end

  def accept_cash(money)
    if money > mony_condition
      money - (money/mony_condition) * mony_return
    end
  end
end

class CashContext

  attr_accessor :cs

  def initialize(type)
    case type
    when '正常收费'
      @cs = CashNormal.new()
    when '打8折'
      @cs = CashRebate.new(0.8)
    when '满三百减100'
      @cs = CashReturn.new(300,100)
    end
  end

  def result(money)
    cs.accept_cash(money)
  end
end

dd=CashContext.new('打8折')
puts dd.result(700)

在上面的代码中result方法中的cs方法返回的是CashRebate对象,下面的代码可以说明问题:

class Demo
  attr_accessor :one

  def initialize(one)
    @one = Example.new
  end
end

class Example
end
obj = Demo.new("hh")
puts obj.one.class

3、单一职责原则
一个类对应一个职责,如果这个类有多余一个职责,则需要建立另外一个类。

4、开放-封闭原则
对扩展开放,对修改封闭。比如工厂模式中要增加加法这个功能,在没有使用工厂模式的情况下,可以为Operation增加这个方法,这破坏的对修改封闭原则,所以这里采用的方法是增加一个加法类,并且继承自Operation,体现了对扩展开放原则。

5、依赖倒转原则
依赖倒转原则
1,高层模块不应该依赖低层模块,两个都应该依赖抽象。
2,抽象不应该依赖细节,细节应该依赖抽象。针对接口编程,不应该针对实现编程。
里氏代换原则
子类型必须能够替换掉他们的父类型。

8、工厂方法模式
简单工厂模式的缺点:增加功能的时候,就需要增加case的条件分支,也就是要修改工厂类,违背了“开放-封闭原则”。下面介绍工厂方法模式:

#运算类
class Operation
  attr_accessor :number_a,:number_b
    
  def initialize(number_a = nil, number_b = nil)
    @number_a = number_a
    @number_b = number_b
  end
    
  def result
  end
end

#加法类
class OperationAdd < Operation
  def result
    number_a + number_b
  end
end

#减法类
class OperationSub < Operation
  def result
    number_a - number_b
  end
end

#乘法类
class OperationMul < Operation
  def result
    number_a * number_b
  end
end

#除法类
class OperationDiv < Operation
  def result
    raise '除数不能为0' if number_b == 0    
    number_a / number_b
  end
end


module FactoryModule
  def create_operation
  end
end
#加法工厂
class AddFactory
  include FactoryModule
    
  def create_operation
    OperationAdd.new
  end    
end

#减法工厂
class SubFactory
  include FactoryModule
    
  def create_operation
    OperationSub.new
  end
end
#乘法工厂
class MulFactory
  include FactoryModule
    
  def create_operation
    OperationMul.new
  end    
end
#除法工厂
class DivFactory
  include FactoryModule
    
  def create_operation
    OperationDiv.new
  end    
end

factory = AddFactory.new
oper = factory.create_operation
oper.number_a = 1
oper.number_b = 2
p oper.result

相比于简单工厂模式,这里的变化是移除了工厂类,取而代之的是具体的运算工厂,分别是加法工厂、减法工厂、乘法工厂和除法工厂。
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到了子类。
这么做的好处是,克服了简单工厂违背“开放-封闭原则”的缺点,又保持了封装对象创建过程的优点。存在的问题是逻辑分支的判断依然需要实现,只不过是从工厂类中转移到了客户端,利用反射?可以解决分支判断的问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容

  • 设计模式基本原则 开放-封闭原则(OCP),是说软件实体(类、模块、函数等等)应该可以拓展,但是不可修改。开-闭原...
    西山薄凉阅读 3,798评论 3 14
  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 3,947评论 1 15
  • 一、设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者...
    RamboLI阅读 749评论 0 1
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,761评论 2 17
  • 面向对象设计的五大原则 单一职责原则(SRP) 一个类应该仅有一个职责。 开放封闭原则(OCP) 对扩展开放,...
    LiuHDme阅读 1,461评论 0 3