乌拉拉
fupansrf
啦啦啦
关注数: 46
粉丝数: 23
发帖数: 923
关注贴吧数: 45
设计模式-可复用面向对象软件的基础 4.1~4.4 适配器模式(Adapter Pattern) 应用场景: 当需要将一个类的接口转换成客户端所期望的另一个接口时。 当需要使用一些已经存在的类,而这些类的接口与当前系统不兼容时。 在使用第三方库或框架时,其提供的接口与项目中的接口不一致,可以通过适配器模式进行转换。 优点: 提高了系统的灵活性和可扩展性。 降低了系统的耦合度,使得系统更加容易维护和升级。 使得原本不能一起工作的类能够协同工作。 缺点: 增加了系统的复杂性,因为需要引入额外的适配器类。 如果过度使用适配器模式,可能会导致系统变得难以理解和维护。 桥梁模式(Bridge Pattern) 应用场景: 当一个类存在两个或多个独立变化的维度时。 当不希望因为某个维度的变化而影响到另一个维度的设计时。 在实现抽象和具体类的分离时,可以使用桥梁模式。 优点: 提高了系统的可扩展性,因为可以在不修改抽象类的情况下,增加新的具体实现。 降低了系统的耦合度,因为抽象和具体实现之间是通过接口进行通信的。 使得系统更加灵活,可以轻松地更换具体实现。 缺点: 增加了系统的复杂性,因为需要引入额外的抽象层和接口。 如果设计不当,可能会导致系统变得难以理解和维护。 组合模式(Composite Pattern) 应用场景: 当需要表示对象的部分-整体层次结构时。 当希望客户端能够忽略组合对象与单个对象的差异,以统一的方式处理它们时。 在需要构建复杂的树形结构时,可以使用组合模式。 优点: 使得客户端能够以统一的方式处理单个对象和组合对象。 提高了系统的可扩展性,因为可以在不修改现有代码的情况下,增加新的组件。 简化了客户端代码,因为客户端不需要区分处理的是单个对象还是组合对象。 缺点: 在设计组合对象时,需要仔细考虑接口的设计,以确保其能够正确地表示部分-整体的关系。 如果组合结构过于复杂,可能会导致系统变得难以理解和维护。 装饰者模式(Decorator Pattern) 应用场景: 当需要动态地给一个对象添加一些额外的职责时。 当这些额外的职责不能通过继承的方式来实现时(因为继承会导致类的爆炸)。 在需要扩展一个类的功能时,可以使用装饰者模式。 优点: 提高了系统的灵活性和可扩展性,因为可以在不修改原有类的情况下,增加新的功能。 避免了类的爆炸,因为不需要为每一个功能都创建一个子类。 使得系统更加容易理解和维护,因为装饰者和被装饰者之间是通过组合关系来连接的。 缺点: 增加了系统的复杂性,因为需要引入额外的装饰者类。 如果过度使用装饰者模式,可能会导致系统变得难以理解和维护。
设计模式-可复用面向对象软件的基础4.1-4.4 适配器模式(Adapter Pattern) 应用场景: 当需要将一个类的接口转换成客户端所期望的另一个接口时。 当需要使用一些已经存在的类,而这些类的接口与当前系统不兼容时。 在使用第三方库或框架时,其提供的接口与项目中的接口不一致,可以通过适配器模式进行转换。 优点: 提高了系统的灵活性和可扩展性。 降低了系统的耦合度,使得系统更加容易维护和升级。 使得原本不能一起工作的类能够协同工作。 缺点: 增加了系统的复杂性,因为需要引入额外的适配器类。 如果过度使用适配器模式,可能会导致系统变得难以理解和维护。 桥梁模式(Bridge Pattern) 应用场景: 当一个类存在两个或多个独立变化的维度时。 当不希望因为某个维度的变化而影响到另一个维度的设计时。 在实现抽象和具体类的分离时,可以使用桥梁模式。 优点: 提高了系统的可扩展性,因为可以在不修改抽象类的情况下,增加新的具体实现。 降低了系统的耦合度,因为抽象和具体实现之间是通过接口进行通信的。 使得系统更加灵活,可以轻松地更换具体实现。 缺点: 增加了系统的复杂性,因为需要引入额外的抽象层和接口。 如果设计不当,可能会导致系统变得难以理解和维护。 组合模式(Composite Pattern) 应用场景: 当需要表示对象的部分-整体层次结构时。 当希望客户端能够忽略组合对象与单个对象的差异,以统一的方式处理它们时。 在需要构建复杂的树形结构时,可以使用组合模式。 优点: 使得客户端能够以统一的方式处理单个对象和组合对象。 提高了系统的可扩展性,因为可以在不修改现有代码的情况下,增加新的组件。 简化了客户端代码,因为客户端不需要区分处理的是单个对象还是组合对象。 缺点: 在设计组合对象时,需要仔细考虑接口的设计,以确保其能够正确地表示部分-整体的关系。 如果组合结构过于复杂,可能会导致系统变得难以理解和维护。 装饰者模式(Decorator Pattern) 应用场景: 当需要动态地给一个对象添加一些额外的职责时。 当这些额外的职责不能通过继承的方式来实现时(因为继承会导致类的爆炸)。 在需要扩展一个类的功能时,可以使用装饰者模式。 优点: 提高了系统的灵活性和可扩展性,因为可以在不修改原有类的情况下,增加新的功能。 避免了类的爆炸,因为不需要为每一个功能都创建一个子类。 使得系统更加容易理解和维护,因为装饰者和被装饰者之间是通过组合关系来连接的。 缺点: 增加了系统的复杂性,因为需要引入额外的装饰者类。 如果过度使用装饰者模式,可能会导致系统变得难以理解和维护。
设计模式-可复用面向对象软件的基础 3.3-3.6 工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。 工厂方法模式建议使用特殊的工厂方法来创建对象,而不是直接调用对象的构造函数。它允许子类重写工厂方法,从而改变创建的产品类型。 只有当产品具有共同的基类或接口时,子类才能返回不同类型的产品,同时基类中的工厂方法还应将其返回类型声明为这一共有接口。 调用工厂方法的代码不需要知道不同子类返回的实际对象之间的差异,不关心其具体实现方式。 适用场景: 无法预知对象确切类别及其依赖关系时; 工厂方法将创建产品的代码与实际使用产品的代码分离, 从而能在不影响其他代码的情况下扩展产品创建部分代码。 希望用户能扩展软件库或框架的内部组件; 将各框架中构造组件的代码集中到单个工厂方法中, 并在继承该组件之外允许任何人对该方法进行重写。 复用现有对象来节省系统资源, 而不是每次都重新创建对象; 优点: 避免创建者和具体产品之间的紧密耦合。 单一职责原则。 开闭原则。 缺点: 需要引入许多新的子类, 代码可能会因此变得更复杂。
设计模式-可复用面向对象软件的基础 3.1-3.2节 抽象工厂模式是一种创建型设计模式,它提供了一种方式,可以将一组有共同主题的单独的工厂封装起来。在这个模式中,抽象工厂定义了一个接口,这个接口声明了不同的工厂方法,这些方法对应于不同的产品类型。每个具体工厂都继承自这个接口,并负责创建具体的产品。这样,抽象工厂模式允许客户端代码与抽象工厂交互,而无需知道(或关心)它正在使用哪个具体工厂。这样,客户端代码就可以从具体产品中解耦出来,从而能够在不同的产品集之间切换,只需改变具体工厂即可。
设计模式-可复用面向对象软件的基础 2.1-2.6 Strategy模式 关键:为策略和其环境设计足够通用的接口,不必为新算法而改动策略或环境 策略模式通常包括三个部分: 上下文(Context):持有一个策略的引用,供客户端调用。 策略接口(Strategy Interface):定义一个算法族的公共接口。 具体策略(Concrete Strategy):实现策略接口的不同算法。
设计模式-可复用面向对象软件的基础 第1章 本章主要介绍了设计模式能够解决的问题:如寻找合适的对象,决定对象的粒度,指定对象接口,描述对象的实现,运用复用机制,设计应支持变化等,另外还介绍了设计模式的选择和使用。
《重构 改善既有代码设计》 第十一章 重构API 函数的参数列表应该概括其潜在的变化性,突显出函数可能展现出不同行为的关键方式。 1. 将查询函数与修改函数分离:区分读取接口和写入接口,独立书写查询接口和提交接口。 2. 函数参数化:利用参数将逻辑相似的多个方法整合。 3. 移除标记函数:当某一参数值的不同会导致后续逻辑很大不同时,应将这一参数移除,并根据逻辑编写对应的函数。 4. 保持对象完整性:使用整个对象作为参数,而不是将对象的各个属性作为参数列表。如果多处代码使用了对象的部分功能,可能需要通过类抽取将这部分功能独立出来。 5. 以查询取代参数:如果函数调用时传入的值对于函数本身来说可以轻易获取,那么这就是冗余,是不必要的,徒增调用者保证参数值正确的责任。 6. 以参数取代查询:将处理引用关系的责任转给函数的调用者,通过将元素的值以参数形式传给函数,以便于目标函数不再依赖于该元素。 7. 移除设值函数: 8. 以工厂函数取代构造函数: 9. 以命令取代函数: 10.以函数取代命令:
重构-改善既有代码的设计 第十章 简化条件逻辑 1. 分解条件表达式 复杂的分支,将代码全部写在一起会显得臃肿,可以将不同分支的代码封装为函数,通过分支语句形成完整逻辑; 2. 合并条件表达式 不同条件的分支,但后续的处理是相同的,可以将各种条件通过与、或进行合并; 3. 以卫语句取代嵌套条件表达式 卫语句:条件为真时立即返回; 当某个分支更重要的时候,可以不采用if else嵌套的形式,而是直接return,但两种方式选择的同时还是要兼顾可读性; 4. 以多态取代条件表达式 针对 switch 语句中的每种分支逻辑创建一个类,用多态来承载各个类型特有的行为,从而去除重复的分支逻辑。 5. 引入特例 特例模式:创建一个特例元素,用以表达对这种特例的共用行为的处理,从而用一个函数调用取代大部分特例检查逻辑。 6. 引入断言 断言可以用来检查始终为真的情况;
啦啦啦啦啦 唔啦啦啦啦
重构-改善既有代码的设计-第9章 1. 拆分变量 变量应根据责任来进行分解,避免一个变量承担多个责任导致阅读混淆。 2.字段改名 良好的命名和整洁的数据结构有助于理解程序行为,随着产品迭代和对程序的深入理解,字段可能需要改名以保持清晰和准确。 3.以查询取代派生变量 可变数据可能导致代码的各个部分互相耦合,因此应尽量限制其作用域。对于可以随时计算出的变量,去掉它们可以减少可变性。然而,如果计算的源数据和结果都是不可变的,那么保留派生变量也是可以的。根据数据的可变性和使用情况,可以选择适合的编程风格,如对象风格或函数风格。 4.引用对象和值对象的选择 对于不变的数据,这两种处理方式都适用,但对于需要更新的数据,将其视为引用对象较为合适。值对象因其不可变性,处理起来更简单,在分布式和并发系统中特别有用。然而,如果需要多个对象共享一个对象并看到其修改,那么这个对象应被视为引用对象,从而避免更新所有副本带来的问题。
重构-改善既有代码的设计 第8章 搬移特性 1.搬移函数 多处频繁调用的函数可以搬移到更通用的地方,类似我们的基础库 2.搬移字段 总是一同出现、一同作为函数参数传递的数据,最好是规整到同一条记录中,以体现它们之间的联系 3. 搬移语句到函数 通过将重复的代码段整合到一个函数中,可以提高代码的复用性和可读性,同时也方便了代码的维护和修改。如果需要为不同调用者实现不同的行为,可以通过将相关代码段搬移出来。 4.搬移语句到调用 随着系统功能的持续演进,原有的抽象边界可能不再适用,调整时的处理方法包括将不同的行为从函数中转移到调用处,或者在调用点和调用者间形成新的边界,需要考虑提炼出新的函数,以便形成更合适的抽象边界。 5. 以函数调用取代内联代码 函数能有效地整合相关行为,消除重复代码,同时也便于修改。相同的内联代码可以替换为函数调用,但是,如果内联代码和函数在实质上并没有关联,那么在修改函数时,就需要避免影响到内联代码的行为,因此需要考虑是否用函数调用来替代。此外,利用库函数可以提高编程效率。 6. 移动语句 将关联代码放一起,有利于代码更容易理解和修改,且是提炼函数等重构工作的前提。在首次使用变量的地方声明它,而不是在函数顶部一次性声明所有变量。 7. 拆分循环 建议一个循环只做一件事情,修改时可以更好地理解和控制。虽然这样可能需要执行两次循环,但可以先重构后优化,因为清晰的代码结构更有利于进一步的优化。循环本身很少成为性能瓶颈,反而拆分循环可以开启更强大的优化手段。 8. 以管道取代循环 使用集合管道编写逻辑的优势在于可读性的提升,通过读代码,可以清晰地理解对象在管道中的变换过程。 9.移除死代码 不再使用的代码应立刻删除,保持代码的整洁和易读性。如果担心以后需要,删除后在代码中留下注释,说明这段代码的存在以及它被删除的提交版本号,通过版本控制系统恢复。
啦啦啦啦啦啦啦 啦啦啦啦啦啦
啦啦啦啦啦啦 啦啦啦啦啦啦啦
啦啦啦啦啦 18722956755又被删了
啦啦啦啦啦啦啦 18722956755又被删了
啦啦啦啦啦啦啦 18722956755又被删了
啦啦啦啦啦啦啦啦啦 18722956755又被删了
今天周几了 今天星期几
来了来了来了 噜啦啦啦啦啦啦
222222 22222222
1111111 111111111
来了来了来了 啦咯啦咯啦咯啦咯啦咯
噜啦啦啦啦啦啦 吐了咯啦咯啦咯啦咯
啦咯啦咯啦咯啦咯 啦咯啦咯啦咯啦咯啦
来了来了来了 她咯啦咯啦咯啦咯啦咯
噜啦啦啦啦啦啦 噜啦啦啦啦啦啦
有早洗哇有早洗哇真转 有早洗哇有早洗哇真转
哈哈哈哈哈 啦咯就来咯哦哦哦哦哦
啦咯啦咯啦咯啦咯啦 啦咯啦咯啦咯啦咯啦咯
测试一下吧 测试测试测试
啦啦啦啦啦 啦咯啦咯啦咯啦咯
啦啦啦啦啦啦 啦咯啦咯啦咯啦咯
testtesttest3 啦啦啦啦啦啦
天空为什么是蓝色 天空为什么是蓝色@贴吧包打听
testtesttest2 啦啦啦
testtesttest1
首页
1
2
3
4
下一页