面向可维护性的设计模式(哈工大软件构造)

  在软件的发展周期中,随着时间的变化,软件的复杂度会得到很大的增长,我们需要对代码的维护付出很大的精力,以便其能适应各种变化,具有良好的可维护性,在之后的维护过程中以较小的成本对软件进行维护。
  在第五章,我们学习了如何使软件具有较高的可维护性,并介绍了几种面向可维护性的设计模式,在此进行总结和分享。
  首先介绍一种创造型模式(Creational Patterns):

工厂方法模式(Factory Method Pattern)

  解决的问题:解决了接口选择的问题。
  解决方法:通过工厂父类定义创建对象的公共接口,而子类则负责生成具体的对象。

  优点:用户只需要知道工厂的名称就可以得到对应的产品,不需要关注产品的生产细节。并且在添加新的产品时,只需要添加对应的具体产品和具体工,满足开闭原则。
  缺点:每增加一个产品,需要对应的增加两个类,提高了系统的复杂度。
  组成成分:
1. 抽象工厂(Abstract Factory):提供创建产品的接口,即最高级的“构造函数”;
2. 具体工厂(Concrete Factory):实现了抽象工厂的接口,完成具体产品的创建;
3. 抽象产品(Abstract Product):定义了产品基本性质的接口。
4. 具体产品(Concrete Product):实现了抽象产品定义的接口,有具体工厂来创建,与具体工厂一一对应。

  处理方式:用户通过具体的工厂生成具体的产品,对客户端隐藏了产品的构建方式。
  具体实现后的UML图如下:
工厂方法模式UML图

抽象工厂模式(Abstract Factory Pattern)

  与抽象方法模式所区别的是,抽象方法模式主要用于产生一个产品,而抽象工厂模式负责产生一族相互之间有关联的产品。
  解决的问题:在工厂方法模式的基础上,对于一系列相互关联的产品创建方式繁琐的问题。
  解决方法:通过工厂父类定义创建对象的公共接口,而子类则负责生成具体的对象。

  优点:用户只需要知道工厂的名称就可以得到对应的产品,不需要关注产品的生产细节。并且在添加新的产品族时,只需要添加对应的具体产品和具体工,满足开闭原则。除此之外,由于抽象工厂可以产生一族产品,故每个工厂类可以创建同一族但是完全不同类型的两个产品。
  缺点:当产品族中需要增加新的产品时,所有的工厂类都要进行修改。即,抽象工厂模式对于新的产品族,满足开闭原则,只需要添加新的具体工厂对产品进行组合。但对新的产品却不满足开闭原则,需要对所有的类进行更改。
  组成成分:
1. 抽象工厂(Abstract Factory):提供创建产品的接口,即最高级的“构造函数”;
2. 具体工厂(Concrete Factory):实现了抽象工厂的接口,完成对多种具体产品的创建;
3. 抽象产品(Abstract Product):定义了产品基本性质的接口。
4. 具体产品(Concrete Product):实现了抽象产品定义的接口,具体工厂来创建,与具体工厂一一对应。

  处理方式:用户通过具体的工厂生成具体的产品族,对客户端隐藏了产品的构建方式。
  具体实现后的UML图如下:
抽象工厂模式UML图
  下面介绍一种结构型模式(Structural Pattern)

代理模式(Proxy Pattern)

  解决的问题:当实体对象具有隐私性、敏感性,或者访问代价大等特性时,需要使用代理模式进行高效访问。
  解决方法:通过以一个新的对象类作为传递实体,对另一个对象进行访问控制。

  优点:可以通过远程代理(Remote Proxy)、虚拟代理(Virtual Proxy)、保护型代理(Protection Proxy)达到信息缓存、替换实体、存取控制等特质。代理模式也起到了分离客户端和目标对象的功能,降低了系统的耦合度。
  缺点:由于代理对象,可能会延迟处理速度,增加系统的复杂度。
  组成成分:
1. 抽象主体(Subject):通过接口或抽象类定义了主体的性质;
2. 真实主体(Real Subject):实现了抽象主体,是代理类所代理的真实对象;
3. 代理类(Proxy):提供了与具体主体相同的接口,一般内部含有对真实主体的引用,可以通过代理类访问、控制或扩展真实主体的功能。

  处理方式:用户端可以按照真实主体的方式对代理类进行调用,所有的处理方式均在代理类中实现。注意,代理模式的访问控制往往发生在对象级别上,通过在代理类中维护一个真实主体的对象达到代理的功能。
  具体实现后的UML图如下:
代理模式的UML图
  最后介绍两种行为型模式(Behavioral Pattern)

观察者模式(Proxy Pattern)

  解决的问题:简洁设置了一个对象和其他多个对象之间有着较为密切关系时复杂的组合关系。
  解决方法:通过面向对象的技术,弱化依赖关系。当被观察者(一)发生变化时,会通知给每一个观察者(多)。

  优点:降低了具有关系的两个对象之间的耦合度,并在两者之间建立了一种触发机制。
  缺点:观察者和被观察者之间的耦合没有完全解除,并且会由于特殊的原因产生“循环引用”。并且当观察者较多时,会延缓系统运行速度。并且观察者只能知道被观察者发生了变化,但不能具体到哪一类变化。
  组成成分:
1. 抽象目标(Subject):即被观察者的抽象类,其中一般需要维护一个观察者的列表,以及对于这个列表的维护操作,如添加、删除等操作。
2. 具体目标(Concrete Subject):实现了抽象目标接口。
3. 抽象观察者(Observer):即观察者的接口,其中一般需要包含一个更新自身的抽象方法,在“观察到”被观察者变化时调整自身状态使用。
4. 具体观察者(Concrete Observer):实现了抽象观察者。

  具体实现后的UML图如下:
观察者模式的UML图
  处理方式:这四个部分的调用顺序如下:
1. 客户端或其他任何地方的变化引起了被观察者的变化。
2. 被观察者调用自身的notifyObserver方法通知自己列表中的所有观察者。
3. 所有的观察者接收到信息后(在notifyObserver方法中被引用调用了自己的response方法),更新自己的状态。

  Java中已经专门定义了Observable接口Observer接口用于实现观察者模式,被观察者要实现Observable接口,观察者要实现Observer接口。 两个接口的主要代码如下:
Observable接口和Observer接口的主要代码

访问者模式(Visitor Pattern)

  解决的问题:解决了一个类针对不同的元素所进行的操作不同的问题。
  解决方法:将作用于不同类的操作封装成类,为数据结构中的每个元素提供多种访问方式,将对数据的操作和数据结构进行分离。
  优点:有很高的扩展性、复用性、灵活性,并且满足单一职责原则,将相关的行为封装在一起,每一个访问者有着单一的功能。
  缺点:对于新的被访问类不满足开闭原则,一旦加入新的被访问类,就需要改变所有的访问者的代码。并且访问者类不满足依赖倒置原则,内部依赖了具体的元素类。
  组成成分:
1. 抽象访问者(Visitor):一个访问具体元素的接口,以参数多态的方式,为每个具体的元素类提供了一个访问操作。
2. 具体访问者(Concrete Visitor):实现了抽象访问者接口。
3. 抽象元素(Element):一个被访问的元素的接口,一般包含有accept方法,参数为一个Visitor类型的对象,表示接受这个访问者进行访问。
4. 具体元素(Concrete Element):实现了抽象元素接口,其中的accept方法一般都是visitor.visit(this) 的形式。
5. 对象结构(Object Structure):其中维护着元素类型的容器,如列表或映射等等,提供了让访问者访问其中所有对象的操作。

  处理方式:通过将具体操作封装成类,设计为访问者类,通过在具体元素自身内调用accept方法传入对应的访问者(操作类),以达到访问该类的目的。
  具体实现后的UML图如下:
访问者模式的UML图

参考博客:
  1. 软件设计模式概述
  2. 菜鸟教程:设计模式
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 设计模式是一种通过提供可复用的解决方案来解决面向对象软件开发中常见问题的方法。这些问题可能包括对象之间的通信、对象的创建和销毁、以及如何组织代码等。 设计模式能够提供一种标准化的方法来解决这些问题,使得开发人员可以更加高效地构建软件系统。设计模式提供了一种用于描述和交流解决方案的共同语言,使得不同开发人员之间可以更好地合作。 设计模式的另一个重要特点是其可复用。一旦开发人员学会了某个设计模式,他们可以在不同的项目中重复使用该模式,从而节省开发时间和资源。这种可复用使得设计模式成为面向对象软件开发的基础之一。 《设计模式可复用面向对象软件的基础》这本书将深入介绍设计模式的原理、分类和具体实现。通过学习这本书,读者可以掌握常见设计模式的应用方法,并了解如何根据具体问题选择最合适的设计模式。该书还包含了大量的示例代码和实际案例,帮助读者更好地理解和应用设计模式。 总结来说,设计模式是一种解决面向对象软件开发中常见问题的方法,具有可复用。《设计模式可复用面向对象软件的基础》这本书通过系统地介绍设计模式的原理、分类和实现,在提高开发效率的同时,帮助读者建立起良好的面向对象软件开发思维方式。 ### 回答2: 设计模式是一种解决软件设计问题的经典方法,它提供了一些通用的解决方案和思想,可用于构建复用的面向对象软件设计模式的目标是提高软件的可维护、可扩展和灵活设计模式包括三种类型:创建型、结构型和行为型。创建型设计模式关注如何实例化对象,包括简单工厂、工厂方法、抽象工厂、建造者和原型。结构型设计模式关注对象之间的组合,包括适配器、装饰器、代理、组合、外观、享元和桥接。行为型设计模式关注对象之间的通信和职责分配,包括观察者、模板方法、策略、状态、责任链、命令、备忘录、迭代器和访问者。 设计模式可提供可复用的解决方案,不仅可以提高软件的开发效率,还能确保软件的可靠和可维护。通过使用设计模式,开发人员可以更加清晰地理解软件系统的结构和功能,使得软件系统更易于理解和维护。同时,设计模式还能促进团队之间的协作和交流,提高团队的开发效率。 《设计模式可复用面向对象软件的基础》这本书提供了系统和详细的介绍和讲解了各种设计模式的原理、实现方法以及应用场景。通过阅读这本书,读者可以深入理解设计模式的核心概念,学习如何在实际项目中应用设计模式,提高软件的质量和可维护。这本书对于想要深入学习和应用设计模式软件开发人员来说是一本非常有价值的参考资料。 ### 回答3: 设计模式指的是用于解决软件设计中常见问题的经验解决方案。它们是软件开发人员在解决类似问题时所提炼出来的最佳实践。设计模式的目标是提高软件的可复用、可扩展和可维护设计模式是通过将常见的设计问题和对应的解决方案进行抽象和总结而得到的。它们是由经验丰富的软件开发人员们共同提炼和归纳出来的,是他们在实际项目中不断探索和总结出来的经验。 设计模式是可复用的,因为它们提供了一种标准化的解决方案,可以在不同的项目中重复使用。这样可以减少开发人员的工作量,提高开发效率。 同时,设计模式也能够提升软件的可扩展,使得软件在面对变化时更加容易进行修改和扩展。通过使用设计模式软件的各个组件之间的耦合得到了降低,使得系统更加灵活和易于维护。 最后,设计模式使得软件更易于维护。因为设计模式遵循了一系列约定和规范,开发人员能够更快地理解和修改代码,从而降低了维护成本。 设计模式可复用面向对象软件的基础,是因为它们提供了一套可复用的解决方案,能够解决软件设计中常见的问题。通过学习和应用设计模式,可以提高软件的质量和开发效率,同时也可以提升开发人员的设计能力和职业素养。在软件开发领域中,设计模式是不可或缺的一部分。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值