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

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

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

策略模式

以上即是策略模式;

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

相关推荐
Java后端的Ai之路9 小时前
02、Python普通工厂模式
开发语言·人工智能·python·设计模式·普通工厂模式
Java后端的Ai之路11 小时前
01、Python - 设计模式介绍
java·人工智能·python·设计模式·通用
小此方11 小时前
Linux加餐(二):藏在Linux中的设计模式(二)单例模式与线程池
linux·单例模式·设计模式
LayZhangStrive1 天前
设计模式(二)装饰器模式、代理模式(待更新)
设计模式·代理模式·装饰器模式·后端开发
AI人工智能+电脑小能手2 天前
大白话说Java设计模式-28-模板方法模式(业务实战篇)
java·设计模式·模板方法模式·spring源码·订单系统·代码复用
leeyi2 天前
两个 Agent 怎么协作:Host-Worker 模式(第91篇-E77)
设计模式·agent·ai编程
AI人工智能+电脑小能手3 天前
大白话说Java设计模式-26-策略模式(业务实战篇)
java·spring·设计模式·策略模式·支付系统·算法切换
星火10243 天前
【Groovy翻译-进阶篇】Groovy 中的设计模式
后端·设计模式·groovy
AI人工智能+电脑小能手3 天前
大白话说Java设计模式-27-策略模式(源码剖析篇)
java·spring·设计模式·策略模式·源码分析·事务管理·comparator
SL_staff3 天前
风控规则如何从硬编码解耦?我们在 JVS-Rules 中的实践与思考
java·spring boot·设计模式