软考四 设计模式

本文详细解读设计模式中的聚合与组合概念,并通过策略模式与状态模式的比较,阐述了设计模式的学习方法与重要性。通过实例解析,帮助读者更好地理解和应用设计模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   软考学习到了设计模式部分了。这次主要是学习HeadFirst,跟刚开始学习大话一样,总有种豁然开朗的感觉。

  记得大话那会,总感觉作者太厉害了,讲解每个模式的时候既能从生活中的实例说起,又能给我们讲明设计模式,从生活入手,当然我们记得也就深刻了,就如说代理模式,具体可能不清楚,但是想起那个啥啥啥代人送礼物。整个过程就会出现,当然模式不想起也就起起来了。这个是大话阶段的感觉。

  那么HeadFirst呢,如果说大话那会学习的“是什么”,那么现在学习的是“为什么”,第一遍的学习只是个认识的过程,再次或者是再再次的学才是真正的学习,这也就是为什么“学而时习之,不亦说乎”的道理吧。

 

  我们都记得关联关系中组合和聚合不一样,一个关系强,一个关系弱,组合不可分聚合可分这些我们很早就记住了,在图中也可以区别它们的不同,但是在代码中呢?下面是我的理解:

 

从代码说不同

说明:一个小组中有好多个人,一个人有两只手。

解析:小组(Group)和人(Person)是聚合关系,人和手(Hands)是组合关系。

 

聚合关系:

小组和人的关系是聚合关系,聚合关系较组合弱。

class Group{

      private People people;
      
      public Group(People people){
         
             this.people = people ;
      }
}

 
 

组合关系:

人和手的关系是组合关系,组合关系较强。

class People{

      private Hands hands;

      public People(){

             hands = new Hands();
      }
}

 

解析:无论是组合关系还是聚合关系,在代码中都增加了其对应的成员变量。如Group中People类型的people,People中Hands类型的hands都成了成员变量了。

           不同的是,组合关系中hands是在People构造函数中实例化的,hands和People是同生同灭的,Group中的构造函数没有实例化People,而是使用了一个引用。也就是为什么我们说组合关系中的部分不能离开整体,聚合关系中部分离开了整体还可以单独存在。

 

    其他几种关系都有对应的代码,这里就不一一说明了,图跟代码对应关系很重要。一定不要忽视。只有弄清楚了这个,在学习设计模式的时候,才能照图写代码。

 

 

 

  下面再说说看图。给出我们一个图,我们一定能看出是哪个模式吗?在设计模式类图不一样的前提下是可以认出来的。但是设计模式中却存在两个类图相同的,知道是哪两个吗??  如下:

 

图一:

 

图二:

 

       图一和图二中的两个设计模式,框架结构是一样的。如果没有图中类名说明不能区别他们。可以想到既然类图都一样了,难不成模式的代码也一样吗。

    既然是两种模式,那么肯定有不同,这可上面说的一种图对应一代码实现是不矛盾的。相同的是框架结构,不同的是模式的设计思想和代码的具体实现。

    下面就比较一下这两个模式吧。

 

策略模式和状态模式的比较:

    从图中很明显的可以看出他们的相同点,类图一样,那么用图对应代码的框架也是一样的。

    不同的是,策略模式封装的算法,最后只有一个算法被使用,状态模式封装的是变化,变化通过不同的状态改变。

    策略模式着重在几种算法的可替换性,算法的替换是在context中调用的,而状态模式,状态的改变则是在子状态中定义状态改变的。

 

    设计模式中,除了策略模式和状态模式有区别联系外,策略模式还可以和模板方法模式。

 

    其实,我们要学的还有很多,努力学吧。

 

 

### 中的23种设计模式详解 #### 创建型设计模式 创建型设计模式主要关注对象的创建过程,通过抽象化和封装来减少硬编码依赖。 1. **抽象工厂(Abstract Factory)** - 提供了一组用于创建一系列相关或相互依赖的对象的接口,而无需指定它们具体的类。这种模式适用于需要跨多个产品族创建对象的情况[^1]。 2. **工厂方法(Factory Method)** - 定义了一个用于创建对象的接口,但由子类决定实例化的具体类。这种方式将对象的创建延迟到了子类实现中,从而提高了灵活性和可扩展性[^3]。 3. **单例(Singleton)** - 确保某一个类只有一个实例,并提供全局访问点。常用于管理共享资源,比如配置文件或数据库连接池[^1]。 4. **生成器(Builder)** - 将复杂对象的构建与其表示分离,使同样的构建过程可以创建不同的表示形式。特别适合于处理具有大量可选参数的对象初始化场景[^2]。 5. **原型(Prototype)** - 使用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。这种方法对于性能优化非常有用,尤其是在频繁克隆的情况下[^1]。 --- #### 结构型设计模式 结构型设计模式主要用于简化复杂的结构关系,提高系统的模块性和重用性。 1. **适配器(Adapter)** - 将不兼容的接口转换成客户端期望的形式,允许原本无法一起工作的类协同工作[^1]。 2. **桥接(Bridge)** - 将抽象部分与其实现部分分离开来,从而使两者都可以独立变化。这有助于降低耦合度并增强系统的可维护性。 3. **组合(Composite)** - 使客户以统一的方式对待单个对象以及对象容器,通常用来描述树形结构的数据层次体系。 4. **装饰器(Decorator)** - 动态地给某个对象增加额外的功能,而不影响其他同类对象的行为。这是一种替代继承的方式来扩展功能的有效手段[^1]。 5. **外观(Facade)** - 提供了一个简化的接口,隐藏了底层系统组件之间的复杂交互细节,降低了外部调用者的认知负担。 6. **享元(Flyweight)** - 主要目的是通过共享技术有效地支持大量的细粒度对象,尤其在内存有限时能显著提升效率[^1]。 7. **代理(Proxy)** - 为另一个对象提供一种控制机制,以便间接访问该对象。它可以用于远程服务调用、缓存或者权限验证等场合[^1]。 --- #### 行为型设计模式 行为型设计模式专注于对象间的职责分配和通信方式。 1. **责任链(Chain of Responsibility)** - 避免请求发送者与接收者之间形成固定的绑定关系,允许多个潜在接受者按顺序尝试处理同一个请求。 2. **命令(Command)** - 将请求封装成对象,从而可以用不同请求对客户端进行参数化;也可以支持撤销操作等功能。 3. **解释器(Interpreter)** - 对于简单的语法表达式,可以通过定义其语言的文法规则并通过递归算法求解语句含义。 4. **迭代器(Iterator)** - 提供一种遍历集合元素的方法,而又不需要暴露集合内部的具体表现形式。 5. **中介者(Mediator)** - 减少对象间直接联系的数量,引入中间层负责协调各参与者之间的协作逻辑[^1]。 6. **备忘录(Memento)** - 不破坏封装性的前提下捕获当前状态保存起来,之后再恢复到之前的状态[^1]。 7. **观察者(Observer)** - 当被观察目标发生改变时自动通知所有注册过的观察者更新自己的数据[^1]。 8. **状态(State)** - 允许对象在其内部状态发生变化时调整它的行为,仿佛改变了自身的类一样[^1]。 9. **策略(Strategy)** - 定义了一系列算法并将每一个都封装起来,使得他们可以互换使用,达到运行期间动态切换的目的。 10. **模板方法(Template Method)** - 在父类中定义好整个流程框架,把某些特定步骤留给子类去完成,既保留核心不变又给予足够的自由空间定制差异之处[^1]。 11. **访问者(Visitor)** - 添加新操作变得容易,因为只需要新增加一个新的访问者即可覆盖现有所有的节点类型。 --- ```python class SingletonMeta(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: instance = super().__call__(*args, **kwargs) cls._instances[cls] = instance return cls._instances[cls] class Singleton(metaclass=SingletonMeta): pass singleton_instance_1 = Singleton() singleton_instance_2 = Singleton() print(singleton_instance_1 is singleton_instance_2) # True ``` --- #### 总结 以上就是中常见的23种经典设计模式及其基本概念介绍。每种模式都有各自适用范围及优缺点分析,在实际开发过程中应根据需求合理选用合适的解决方案。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值