I want to fly higher
programming Explorer
posts - 112,comments - 263,trackbacks - 0
示例切入(鸭子游戏)
  • 游戏中会有各种鸭子,一边游泳,一边咕咕叫
  • 设计了一个鸭子的抽象基类,并让各种鸭子继承此基类

  • 如果让鸭子飞,怎么办?
  • 问题
    • 并非所有的鸭子都能飞,在基类中增加fly会导致所有的子类都具备fly,连那些不该具备fly的子类也无法排除
    • 非常粗暴的解决办法就是每个子类都要仔细判断是否要覆写相关逻辑,比如不会飞的鸭子那么覆写fly方法,什么事情都不做即可;如果遇到不是咕咕叫的鸭子,则覆写quack方法
    • 继承的缺点
      • 代码在多个子类中重复
      • 很难知道所有鸭子的全部行为
      • 运行时的行为不容易改变
      • 改变会牵一发动全身
    • 每当新增新的鸭子子类,需要被迫检查并可能需要覆盖fly和quack方法--噩梦啊
  • 使用接口
    • 把fly从基类中抽出来,放进一个Flyable接口,只有会飞的鸭子才实现此接口;同样的方式,设计一个Quackable接口,因为并非所有鸭子都会叫
    • 问题
      • 解决了一部分问题,不会再有“会飞的橡皮鸭(继承方式)”
      • 但无法进行代码复用-如后续几十个能飞的鸭子的飞行逻辑一致,不但每一个子类都需要写一遍(大量重复的代码)而且如果修改飞行逻辑的话,则需要全部都修改一遍
  • 归零
    • 使用继承不能很好的解决问题,鸭子的行为在子类不断的改变并且让所有的子类都有这些行为是不恰当的
    • 使用Flyable和Quackable接口解决了一部分问题,只有会飞的鸭子才会实现Flyable.但是Java接口不具有实现代码,所有实现接口无法达到达到代码的复用
    • 设计原则
      • 找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起
      • 把变化的部分取出并封装起来,以便以后可轻易的改动或扩充此部分而不影响不需要变化的的其他部分
      • 分开变化和不会变化的部分
      • 面向接口编程,而不是面向实现编程
    • 飞行行为和咕咕叫行为已经和鸭子类无关了
    • 整合
    • 最终版本
    • 多用组合,少用继承
S.O.L.I.D 面向对象设计五大基本原则
  • S-单一职责原则
    • 一个类应该只有一项工作
    • 如计算类只负责计算,而不负责展示,展示需要交由单独的展示类进行处理
  • O-开放封闭原则
    • 对扩展开放,对修改关闭
    • 一个类无需修改类本身却容易扩展
    • 如计算类中的计算图形面积方法大量的if/else,增加图形要增加大量的if/else-改由图形本身去计算
  • L-里氏替换原则
    • 每一个子类或派生类应该可以替换它们基类或父类
  • I-接口隔离原则
    • 不应强迫客户端实现一个它用不上的接口,或是说客户端不应该被迫依赖它们不使用的方法
  • D-依赖反转原则
    • 依靠抽象而不是具体实现。它表示高层次的模块不应该依赖于低层次的模块,它们都应该依赖于抽象
面向模式的软件架构
  • 架构模式
    • Layers/Pipes and Filters/Blackboard/Microkernel/BrokerMVC/PACReflection
    • Whole-Part/Master-Slave/Proxy/Command Processor/View Handler/Forwarder-Receiver/Client-Dispatcher-Server/publisher-subscriber/
    • Reactor/Proactor/Acceptor-Connector/Aysnchronous Completion Token/Active Object/Thread-Speific Storage
    • Loopup/Lazy Acquisition/Caching/Pooling/Resouce Lifecycle Manager/
  • 设计模式
    • The 23 Gang of Four Design Patterns
    • Creational Patterns
      • Abstract Factory/Builder/Factory Method/Prototype/Singleton
    • Structural Patterns
      • Adapter/Bridge/Composite/Decorator/Facade/Flyweight/Proxy
    • Behavioral Patterns
      • Chain of Resp/Command/Interpreter/Iterator/Mediator/Memento/Observer/State/Strategy/Template/Visitor
  • 成例
    • 特定语言的,如引用计数(CounterPointer)
  • 抽象、封装、信息隐藏、模块化、分离关注点、耦合与内聚、充分-完整-简单、策略与实现分离、接口与实现分离、单个引用点、分而治之
  • landon:抽象(个人认为写代码最高境界就是抽象)、解耦、开闭
JDK源代码浅析
  • 经典的集合框架
ref
  • 《Head First Design Patterns》
  • 《Pattern-Oriented Software Architecture》
posted on 2016-11-04 11:31 landon 阅读(1757) 评论(0)  编辑  收藏 所属分类: ServerFramework

只有注册用户登录后才能发表评论。


网站导航: