设计模式(Java版)——知识总结

设计原则(6个)

单一职责原则

  • 所谓的单一职责原则,就是对于一个类而言只专注于做一件事和仅有一个引起变化的原因。优点:1.降低类的复杂性、2.提高类的可读性、3.提高代码的可维护性和复用性、4.降低因变更引起的风险

里氏替换原则

  • 所谓的里氏替换原则,所有引用基类(父类)的地方必须能透明地使用其子类,而且替换为子类也不会产生任何错误或异常。优点:1.提高嗲吗的可重用性和可扩展性、2.代码共享,减少工作量、3.提高项目开放性;缺点:1.继承是入侵式的、2.降低代码的灵活性、3.增强代码耦合性

依赖倒置原则

  • 所谓的依赖倒置原则,就是模块间的依赖通过抽象发生,实现类之间的依赖关系通过接口或抽象类产生,接口和抽象类不依赖于实现类,实现类依赖于接口或抽象类。优点:1.减少类间耦合性、2.提高系统稳定性、3.降低并行开发风险、4.提高代码可读性和可维护性

接口分离原则

  • 所谓的接口分离原则,就是一个接口代表一个角色,不把不同角色交给一个接口,把没有关系的接口合并在一起,形成一个臃肿的大接口。

开放封闭原则

  • 所谓的开放封闭原则,就是软件实体对扩展开放,对修改关闭,在设计一个模块的时候,应当使这个模块可以不被修改的前提下被扩展(改变这个模块的行为)

迪米特法则

  • 所谓的迪米特法则,就是如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。

创建型模式(5种)

1.使用单例模式记录访问次数

  • 单例模式主要作用时确保一个类只有一个实例存在。可以用在建立目录、数据库连接等需要单线程操作的场合,用于实现对系统资源的控制。

2.通过农场系统演示工厂方法模式

  • 工厂方法模式的用意时定义一个工厂接口,将实际创建工作推迟到子类中。核心工程类不再负责所有产品的创建,而是将具体创建的工作交给子类。核心类成为一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,不接触产品类被实例化的细节。(4个角色:抽象工厂角色、具体工厂角色、抽象产品角色、具体产品角色)
  1. 抽象工厂角色(Creator):工厂方法模式的核心,与应用系统无关,任何在创建对象的工厂类必须实现这个接口
  2. 具体工厂角色(Concrete Creator):实现抽象工厂接口,含有与应用密切相关的逻辑,并且受到应用程序的调用,以生产对象
  3. 抽象产品角色(Product):负责定义产品的共性,实现对产品最抽象的定义
  4. 具体产品角色(Concrete Product):实现抽象产品接口,工厂方法模式所创建的对象,都是某个具体产品角色的实例

3.演示抽象工厂模式

  • 抽象工厂模式是工厂方法模式的进一步抽象,针对的是一族产品。如果产品族中只有一种产品,则抽象工厂模式就退化为工厂方法模式。(4个角色:抽象工厂角色、具体工厂角色、抽象产品角色、具体产品角色)

4.使用建造者模式完成计算机的生产

  • 建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
  • 建造者模式中有4个角色:
  1. 抽象建造者角色:该角色用于规范产品的各个组成部分,并进行抽象,一般独立于应用程序的逻辑
  2. 具体建造者角色:该角色实现抽象建造者中定义的所有方法,并返回一个组建好的产品实例
  3. 产品角色:该角色是建造中的复杂对象,一个系统中会有多于一个的产品类,这些产品类并不一定有共同的接口,完全可以是不相关联的
  4. 导演者角色:负责安排已有模块的顺序,然后使用抽象建造角色开始建造。

5.通过邮件克隆群发演示原型模式

  • 用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。
  • 原型模式涉及3个角色
  1. 客户角色:提出创建对象的请求
  2. 抽象原型角色:该角色是一个抽象角色,通常由一个Java接口或抽象类实现,给出所有的具体原型类所需的接口。
  3. 具体原型角色:该角色是被复制的对象,必须实现抽象原型接口
  • 在实际项目中,原型模式一般和工厂方法模式一起出现,通过clone()方法创建对象,由工厂方法提供给调用者

结构型(7种)

1.通过游戏代练演示代理模式

  • 为其他对象提供一种代理以控制对这个对象的访问。状态模式、策略模式、访问者模式本质上也采用了代理模式。
  • 代理模式的3个角色
  1. 抽象主题(Subject)角色:该角色是真实主题和代理主题的共同接口,以便在任何可以使用真实主题的地方都可以使用代理主题。
  2. 代理主题(Proxy Subject)角色:也叫委托类或代理类,负责控制对真实主题的引用,负责在需要的时候创建或删除真实主题对象,并且在真实主题角色处理前后做预处理和善后处理工作。
  3. 真实主题(Real Subject)角色:也叫被委托角色、被代理角色,是业务逻辑的具体执行者。

2.通过对裸车进行装饰演示装饰模式

  • 动态地给一个对象添加一些额外的职责(属性)。相比于生成一个子类,装饰模式更灵活。
  • 装饰模式有4个角色
  1. 抽象构件角色(Component):用于规范需要装饰的对象
  2. 具体构件角色(Concrete Component):实现抽象构件接口,定义一个需要装饰的原始类
  3. 装饰角色(Decorator):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口
  4. 具体装饰角色(Concrete Decorator):负责对构件对象进行装饰

3.通过将水饺转换成馄饨演示适配器模式

  • 将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法一起工作的两个类能够一起工作。
  • 适配器模式有3个角色:
  1. 目标角色(Target):定义要转换成的目标接口
  2. 源角色(Adaptee):需要被转换成目标角色的源角色
  3. 适配器角色(Adapter):适配器模式的核心,通过继承或者是类关联的方式,将源角色转换成目标角色

4.通过实现公司各部门员工层次关系演示组合模式

  • 将对象组合成树形结构以表示“部分——整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性
  • 组合模式有3个角色:
  1. 抽象构件角色(Component):定义参加组合对象的共有方法和属性,规范一些默认的行为接口
  2. 叶子构件角色(Leaf):是叶子对象,旗下没有其他分支,定义出参加组合的原始对象的行为
  3. 树枝构件角色(Composite):代表参加组合的,旗下有分支的树枝对象,它的作用是将树枝和叶子组合成一个树形结构,并定义出管理子对象的方法。如add()、remove()等

5.通过实现使用多颜色多种图形的过程演示桥梁模式

  • 桥梁模式也称桥接模式。将抽象和实现解耦,使得两者可以独立地变化。
  • 桥梁模式有4个角色
  1. 抽象化角色(Abstraction):抽象化给出的定义,并保存一个对实现化对象的引用
  2. 实现化角色(Implementor):给出实现化角色的接口,但不给出具体实现
  3. 修正抽象化角色(RefinedAbstraction):扩展抽象化角色,引用实现化角色并对抽象化角色进行修正
  4. 具体实现化角色(ConcreteImplementor):对实现化角色接口中的方法进行具体实现

6.通过模拟秘书为老板安排工作的过程演示外观模式

  • 要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。外观模式提供一个高层次的接口,使得子系统更易使用。
  • 外观模式有2个角色:
  1. 外观角色(Facade):调用该角色方法,该角色知晓相关子系统的功能和责任。正常情况下,该角色会将所有从客户端发来的请求委派到相应的子系统,即该角色没有实际的业务逻辑,只是一个委托类
  2. 子系统角色(Subsystem):同时用一个或多个子系统,每个子系统都不是一个单独的类,而是一个类的集合。子系统不知道外观角色的存在,对于子系统,外国角色只是一个客户端。

7.通过模拟下围棋的过程演示享元模式

  • 享元模式是以共享的方式高效地支持大量的细粒度对象。享元对象能够做到共享的关键是区分内部状态和外部状态。内部状态存储在对象内部,不会随环境改变。外部状态随环境改变且不能共享状态。享元模式有4个角色
  1. 抽象享元角色(Flyweight):对享元类进行抽象,需要外部状态的操作可以通过参数的形式将外部状态传入。
  2. 具体享元角色(ConcreteFlyweight):实现抽象享元定义的业务,注意享元对象的内部状态必须与环境无关,从而使得享元对象可以在系统内共享。
  3. 享元工厂(FlyweightFactory)角色:构造一个池容器,负责创建和管理享元角色,并提供从池容器中获得对象的方法,保证享元对象可以被系统适当的共享。当一个客户端对象请求一个享元对象时,享元工厂角色会检查系统中是否已经有一个符合要求的享元对象。
  4. 客户端角色:需要自行存储所有享元对象的外部状态。

行为型模式

使用模板方法模式计算银行活期和定期账户的利息

  • 定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。优点:1.封装不变的部分,扩展可变部分、2.抽取公共部分代码,便于维护、3.行为由父类控制,子类实现
  • 模板方法有两个角色
  1. 抽象模板角色(AbstractTemplate):定义一个或多个抽象操作,以便让子类实现;这些抽象操作时基本操作,是一个顶级逻辑的组成步骤。还需要定义并实现一个或几个模板方法,这些模板方法一般是具体方法,即一个框架,实现对基本方法的调度,完成固定的逻辑
  2. 具体模板角色(Concrete Template):实现抽象模板中定义的一个或多个抽象方法,每个抽象模板角色都可以有任意多个具体模板角色与之对应,而每个具体模板都可以给出这这些抽象方法的不同实现,从而使得顶级逻辑的实现各不相同。

使用Java中的事件处理演示命令模式

  • 将一个请求封装成一个对象,从而使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
  • 命令模式的4个角色:
  1. 命令角色(Command):声明一个给所有具体命令类的抽象接口,定义需要执行的命令
  2. 具体命令角色(Concrete Command):定义一个接收者和行为之间的弱耦合,实现命令方法,并调用接收者的相应操作
  3. 调用者角色(invoker):负责调用命令对象执行请求
  4. 接收者(Receiver):负责具体实施和执行一个请求

使用击鼓传花游戏演示责任链模式

  • 责任链模式使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。
  • 责任链的2个角色
  1. 抽象处理者角色(Handler):对请求进行抽象,定义一个方法以设定和返回对下一个处理者的引用
  2. 具体处理者(Concrete Handler):接收到请求后,选择将请求处理或传给下一个处理者。具体处理者持有对下一个处理者的引用。

使用图书销售中不同的折扣算法演示策略模式

  • 定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。优点:1.提供管理算法的办法,将公共代码转移到了父类、2.提供替换继承关系的办法、3.避免使用多重条件转移语句,提高代码可维护性
  • 策略模式的3个角色:
  1. 环境角色(Context):也叫上下文角色,屏蔽高层模块对策略、算法的直接访问,持有一个Strategy类的引用
  2. 抽象策略角色(Strategy):对策略、算法进行抽象,定义每个策略或算法必须具有的方法和属性
  3. 具体策略角色(Concrete Strategy):实现抽象策略中的具体操作,含有具体的算法。

使用迭代器遍历集合中的元素演示迭代器模式

  • 迭代器模式即,提供一种方法访问一个容器对象中各个元素,而有不暴露该对象的内部细节。优点:1.简化遍历容器操作、2.算法独立于聚集角色,用户无需知道对象类型
  • 迭代器的4个角色:
  1. 抽象迭代器角色(Iterator):负责定义访问和遍历元素的接口
  2. 具体迭代器角色(Concrete Iterator):实现Iterator接口,完成容器元素的遍历
  3. 抽象聚集角色(Aggregate):该角色提供创建迭代器角色的接口
  4. 具体聚集角色(Concrete Aggregate):实现抽象聚集接口,创建出容纳迭代器的对象

模拟婚姻中介所的工作过程演示中介者模式

  • 用一个中介对象封装一系列对象的交互,中介者使各个对象不需要显示地相互作用,从而使耦合松散。
  • 中介模式的4个角色:
  1. 抽象中介者角色(Mediator):定义出同时对象到终结者对象的统一接口,用于个同事角色之间的通信
  2. 具体中介者(Concrete Mediator):实现抽象中介,依赖于各个同事角色,并通过协调各同事角色实现协作行为
  3. 抽象同事角色(Colleague):定义中介者到同事对象的接口,同事对象只知道中介者而不知道其他的同事对象
  4. 具体同事角色(Concrete Colleague):实现抽象同事类,每个具体同事类都清楚自己在小范围内的行为,而不知道大范围内的目的。

模拟按钮控件的事件处理机制演示观察者模式

  • 观察者模式也称发布订阅模式,定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会的到通知并被自动更新。
  • 观察者模式的4个角色
  1. 抽象主题角色(Subject):又称为“被观察者”,可以增加和删除观察者对象
  2. 抽象观察者角色(Observer):该角色为所有的具体观察者定义一个接口,在得到主题的通知时更新自己
  3. 具体主题角色(Concrete Subject):将有关状态存入具体观察者对象,在具体主题的内部状态改变时,给所有登记过的观察者发出通知
  4. 具体观察者角色(Concrete Observer):实现抽象观察者所要求的更新接口,使自身的状态与主题的状态相协调

模拟版本控制系统的工作过程演示备忘录模式

  • 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。以后就可以将该对象恢复到原先保存的状态。
  • 备忘录的3个角色
  1. 发起人角色(Originator):记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘数据
  2. 备忘录角色(Memento):负责存储发起人角色的内部状态,在需要时提供发起人需要的内部状态数据。
  3. 负责人角色(Caretaker):对备忘录角色进行管理、保存和提供备忘录

模拟对计算机各种硬件的访问演示访问者模式

  • 封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下,定义作用于这些元素的新操作。
  • 访问者的5个角色
  1. 抽象访问角色(Visitor):声明一个或多个访问操作,定义访问者可以访问哪些元素
  2. 具体访问者(Concrete Visitor):实现抽象访问者角色中的各个访问操作。
  3. 抽象元素角色(Element):声明一个接受操作和一个访问者对象
  4. 具体元素角色(Concrete Element):实现抽象元素中的接受操作
  5. 结构对象(Object Structure):可以遍历结构中的所有元素。如果需要,提供一个高层次的接口让访问者对象可以访问每个元素,可以设计一个复合对象或者一个集合,如List或Set

模拟电视频道切换的过程演示状态模式

  • 该模式允许一个对象在其内部状态改变时改变其行为。
  • 状态模式的3个角色
  1. 抽象状态角色(State):封装环境对象的一个特定状态所对应的行为
  2. 具体状态角色(Concrete State)角色:该角色实现环境的一个状态所对应的行为。
  3. 环境角色(Context):定义客户端需要的接口,负责具体状态的切换。保留一个具体状态类的实例,该实例给出环境对象的现有状态

模拟对四则运算表达式的计算演示解释器模式

  • 解释器模式是一种按照规定语法对表达式进行解析的方案。
  • 解释器的5个角色
  1. 抽象表达式(Abstract Expression):声明一个所有的具体表示式角色都需要实现的抽象接口,该接口是一个解释操作interpret()方法
  2. 终结符表达式(Terminal Expression):现实抽象表示式角色所要求的接口,文法中的每个终结符都有一个具体终结表达式与之对应。
  3. 非终结符表达式(Nonterminal Expression):是一个具体角色,文法中的每个规则都对应一个非终结符表达式类
  4. 环境角色(Context):提供解释器之外的一些全局信息
  5. 客户端角色(Client):创建一个抽象语法树,调用解释操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值