乌,
fupansrf
啦啦啦
关注数: 21
粉丝数: 9
发帖数: 705
关注贴吧数: 37
哦舅舅舅舅舅舅舅舅 舅舅舅舅舅舅舅
啦啦啦啦啦啦啦啦 啦啦啦啦啦啦啦啦
最新的云缨皮肤怎么获取 啊啊啊,求助
你是你是你是
《设计模式》第5章 可复用面向对象软件的基础 5.9-5.11 策略模式 通过定义一系列算法,并将每个算法封装在一个单独的策略类中,达到算法可以互相替换,并且算法的变化不会影响到使用算法的客户端。 在策略模式中,客户端将所需策略传递给上下文,上下文通过通用接口与策略交互,从而实现不同的功能。 应用场景: 1.系统需要动态地在几种算法中选择一种 2. 隔离业务逻辑与算法实现
设计模式-可复用面向对象软件的基础 5.6-5.8 备忘录模式允许对象创建自身状态的快照,并在需要时恢复到以前的状态。 通过将对象状态的副本存储在名为 备忘录 的特殊对象中来避免其他对象从外部复制对象的状态。 备忘录模式还限制了对备忘录内容的访问,只有创建备忘录的对象可以获取快照中的原始状态,其他对象只能获取快照的元数据。 在备忘录模式中,负责人 负责保存备忘录,但不能修改储存在备忘录中的状态,但是原发器对象可以随时恢复其以前的状态。 在实际应用中,例如文字编辑器,可以创建一个历史类作为负责人,每次执行操作前都会在历史类中添加一个备忘录。当需要撤销操作时,历史类会取出最近的备忘录并让编辑器进行回滚。 应用场景: 文本编辑器的撤销操作; 数据库系统的事务管理:在数据库系统中,事务必须是原子的,即要么完全成功,要么完全失败。在执行事务过程中,如果发生错误,系统可以利用备忘录模式恢复到事务开始之前的状态。 Git:可以保存项目的不同版本状态,当需要回滚到以前的版本时,可以通过备忘录恢复到之前的状态。
设计模式-可复用面向对象软件的基础 5.4-5.5 5.4 迭代器模式 迭代器模式提供了一种方法来访问集合对象中的各个元素,而又不需要暴露该对象的内部表示。 把迭代的过程从业务逻辑中分离出来,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素。 主要包括以下角色: 迭代器(Iterator):迭代器定义访问和遍历元素的接口,一般包含 hasNext(是否存在下一个元素)和 next(获取下一个元素)等方法。 具体迭代器(Concrete Iterator):具体迭代器实现迭代器接口,对聚合对象进行遍历访问。 聚合对象(Aggregate):聚合对象是存放元素的容器,一般提供一个创建迭代器的方法。 具体聚合对象(Concrete Aggregate):具体聚合对象实现创建迭代器的方法,返回一个具体迭代器实例。
设计模式——代理模式 代理模式是一种设计模式,它可以通过创建一个代理对象来控制对原始对象的访问。 代理模式的应用场景: 延迟初始化:可以在需要时才创建对象; 访问控制:可以控制特定客户端使用服务对象; 本地执行远程服务:可以通过网络传递客户端请求; 记录日志请求:可以保存对服务对象的请求历史; 缓存请求结果:可以缓存大体积的返回结果; 智能引用:可以在没有客户端使用某个对象时销毁该对象。
啦啦啦啦啦啦啦啦啦啦啦啦
设计模式-可复用面向对象软件的基础 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
下一页