设计原则(一)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 更好

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

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

策略模式

以上即是策略模式;

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

相关推荐
J_liaty13 小时前
23种设计模式一代理模式
设计模式·代理模式
苏渡苇20 小时前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
短剑重铸之日20 小时前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
feasibility.21 小时前
AI 编程助手进阶指南:从 Claude Code 到 OpenCode 的工程化经验总结
人工智能·经验分享·设计模式·自动化·agi·skills·opencode
BD_Marathon21 小时前
七大设计原则介绍
设计模式
YigAin1 天前
Unity23种设计模式之 享元模式
设计模式·享元模式
范纹杉想快点毕业2 天前
实战级ZYNQ中断状态机FIFO设计
java·开发语言·驱动开发·设计模式·架构·mfc
茂桑2 天前
DDD领域驱动设计-基础设施层
设计模式·架构
小温冲冲2 天前
通俗且全面精讲工厂设计模式
设计模式
进击的小头2 天前
设计模式与C语言高级特性的结合
c语言·设计模式