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

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

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

策略模式

以上即是策略模式;

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

相关推荐
Yu_Lijing6 小时前
基于C++的《Head First设计模式》笔记——模式合作
c++·笔记·设计模式
S-X-S7 小时前
常用设计模式+集成websocket
websocket·设计模式
编程饭碗11 小时前
【二十三种设计模式】
设计模式
茶本无香18 小时前
设计模式之五—门面模式:简化复杂系统的统一接口
java·设计模式
小码过河.19 小时前
设计模式——模板方法模式
python·设计模式·模板方法模式
Engineer邓祥浩19 小时前
设计模式学习(19) 23-17 观察者模式
学习·观察者模式·设计模式
一条闲鱼_mytube19 小时前
智能体设计模式(六)资源感知优化-推理技术-评估与监控
网络·人工智能·设计模式
一条闲鱼_mytube20 小时前
智能体设计模式(七)优先级排序-探索与发现
网络·人工智能·设计模式
羞儿1 天前
Agent设计模式与工程化
设计模式·知识图谱·agent·rag·mcp·指导开发
点云SLAM1 天前
C++(C++17/20)最佳工厂写法和SLAM应用综合示例
开发语言·c++·设计模式·c++实战·注册工厂模式·c++大工程系统