设计原则(一)Head First设计模式

设计原则一:

识别应用中变化的方面 ,把它们和不变的方面分开。

换句话说,如果每次有新的需求,某方面的代码就要变,那么你就知道了,这个行为需要抽出来,与其他不变的代码分离。

下面是这个原则的另一种思考方式:把会变化的部分取出并封装,这样,以后你就可以修改或扩展这个部分,而不会影响其他不需要变化的部分。

尽管这个概念很简单,它却是几乎每一个设计模式的基础。所有模式都提供了一种方式,让系统的某部分独立于其他部分而变化。

设计原则二:

针对接口编程,而不是针对实现编程。

"针对接口编程" 真正的意思是**"针对超类型编程"**。

"接口"一词在这里有多个含义。接口是一个概念,也是Java的一个构造。针对接口编程不必真的使用Java接口 。要点是通过针对超类型编程来利用多态 ,这样,实际的运行时对象不会锁定到代码 。我们可以重新描述"针对超类型编程"为"变量所声明类型应该是超类型 ,通常是抽象类或接口 ,这样,分配给这些变量的对象可以是超类型的任何具体实现,这意味着类声明时不必知道实际的对象类型!"

对实现编程是:

java 复制代码
Dog d = new Dog();
d.bark();

而针对接口/超类型编程则是:

java 复制代码
Animal animal = new Dog();
animal.makeSound();

更棒的是,字类型实例化不用再代码中硬编码(像new Dog()),而是在运行时分配具体的实现对象:

java 复制代码
a = getAnimal();
a.makeSound();

没有蠢问题:

问: 是否我总要不得不先实现应用 ,再看看什么地方有变化,然后回去分离和封装这些地方?

答: 不总是这样,通常你在设计应用时,预测哪些区域会变化 ,然后预先在代码中加入弹性。您会发现原则和模式可以应用在开发生命周期的任何阶段。

问:应不应该把Duck也做成接口?

答: 本例中不要。正如你看到的,一旦我们把每样东西整合在一起,不把Duck作为接口是有好处的,让特定的鸭子,像MallardDuck,继承共同的属性和方法。

既然我们从Duck继承中移除了变化的部分,就获得了继承结构的好处,而不会带来问题。

问: 一个类只有行为,感觉似乎有点怪异。类不是应该代表事务吗 ?应该兼有状态"和"行为才对呀?

答: 在一个OO系统中,是的,类代表事务 ,通常兼有状态(实例变量)和方法 。在本例中,事务碰巧是行为 。但即使是行为,也仍然可以有状态和方法。飞行行为可以有实例变量表达飞行行为的属性(翅膀每分钟拍几下、最大高度、速度等)。

设计原则三:

优先使用组合而不是继承。

IS-A(是一个)HAS-A(有一个)IMPLEMENTS(实现)

HAS-A 比 IS-A 更好

通过组合正确的行为对象获得它们的行为。

正如你已经看到的,使用组合创建系统给了你更大的弹性。不仅是让你把一个算法家族封装进它们自己的一组类,而且让你在运行时改变行为,只要组合的对象实现正确的行为接口。

策略模式

以上即是策略模式;

正式定义 :策略模式定义了一个算法族 ,分别封装起来,使得它们之间可以互相变换 。策略让算法的变化独立于使用他的客户。

相关推荐
沫璃染墨12 分钟前
《Linux工程实践篇(一):认识设计模式——从日志系统看策略模式》
linux·c++·安全·设计模式·策略模式
十六宿舍2 小时前
【软件设计模式-第一课:基础知识了解】
设计模式·架构·面向对象·软件架构
geovindu5 小时前
rust: Facade Pattern
开发语言·后端·设计模式·rust·外观模式
怕浪猫7 小时前
面试官让我手写一个 Tool Use,我用了 3 种方案
设计模式·面试·程序员
geovindu1 天前
rust: Abstract Factory pattern
开发语言·后端·设计模式·rust·抽象工厂模式
Carl_奕然1 天前
【智能体】Loop 的四种设计模式之:Event-Driven Loop(2026 最新版)
人工智能·驱动开发·python·设计模式
Carl_奕然1 天前
【智能体】Loop 的四种设计模式之:Hill Climbing Loop(2026 最新版)
人工智能·python·设计模式
晚安code2 天前
设计模式入门:吃透 SOLID 原则与迪米特法则,再学 5 个高频模式
后端·设计模式
染指11102 天前
135.Agent-多Agent框架-LangChain多智能体(SubAgents子代理)
数据库·人工智能·设计模式·langchain·agent·agents
路弥行至3 天前
【Head First 设计模式】第 2 章:观察者模式 —— 用现代 C++ 重新解读“交互对象的松耦合
c++·经验分享·笔记·观察者模式·设计模式·入门教程·headfirst