设计模式——应用场景

单例模式

应用场景

1、系统只需要一个对象;
2、客户调用类的单个实例只允许使用一个公共访问点,除了该访问点,不能通过其他途径访问该实例。

适配器模式

定义
将一个接口转换成客户希望的另一个接口,使接口不谦容的那些类可以一起的工作,别名为包装器,既可以作为类结构型模式,也可以作为对象结构型模式。

应用场景
1、系统需要使用一些现有的类,而这些类的接口不符合系统的要求,甚至没有这些类的源代码;
2、想创建一个可以重复的类,用于与一些彼此之间没有太大关联的类,包括一些可能在将来引进的类一起工作。

桥接模式

定义
将抽象部分与实现部分分离,使它们都可以独立地变化。存在两个维度的对象,如果采用继承的方式来添加实现会产生大量的类,将这两个独立变化维度的类可以分为抽象类和实现类两个角色。
个人理解
画笔的粗细与颜色,如果不分离这两个维度,增加一种颜色就得增加对应的粗细的画笔。将粗细和颜色分离,将粗细作为抽象部分,颜色作为实现部分,抽象部分包含着色的操作,如果想增加颜色就只需要增加一个实现类。

应用场景
1、如果一个系统需要在抽象类和具体类之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系,通过桥接模式可以时他们在抽象层建立一个关联关系。
2、抽象部分和实现部分可以以继承的方式独立扩展而不会互相影响,在程序运行时可以动态地将一个抽象类子类的对象和一个实现类子类的对象进行组合,即系统需要对抽象类角色和实现类角色进行动态耦合。
3、一个类存在两个独立变化的维度,且这两个维度都需要独立进行扩展。
4、对于那些不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。

组合模式

定义
组合多个对象形成树形结构以表示具有"整体——部分"关系的层次结构,组合模式对单个对象和组合对象的使用具有一致性,组合模式又可以成为"整体——部分"模式,是一种对象结构型模式。
应用场景
1、 在具有整体和部分的层次结构中,希望通过一种方式忽略整体和部分的差异,客户端可以一致性地对待它们。
2、在一个使用面向对象语言开发的系统中需要处理一个树形结构;
3、在一个系统中能够分离出叶子对象和容器对象,而且它们的类型不固定,需要增加一些新的类型。

装饰模式

定义
动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活,是一种对象结构型模式。

透明装饰模式与半透明装饰模式

在实际使用过程中,对于新增行为单独调用的形式,称为半透明模式,平常标准的装饰模式是透明装饰模式

  • 透明模式可以让客户端透明地使用装饰之前和装饰之后的对象,无须关心它们的区别。还可以对一个已经装饰过得对象进行多次装饰,得到更为复杂,功能更强大的对象。

  • 半透明可以给系统带来更多的灵活性,设计相对简单,使用起来也非常方便,切点就是不能实现对同一对象的多次装饰,而且客户端需要有区别地对待装饰之前的对象和装饰之后的对象。

应用场景
1、在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责;
2、当不能采用继承的方式对系统进行扩展或者采用继承不利于系统扩展和维护是可以使用装饰模式。不能采用继承的情况主要有两类:第一类是系统中存在大量独立的扩展,为支持每一种扩展或扩展之间的组合将产生大龄的子类,使得子类数目呈爆炸性增长,第二类是类已经被定义为不能被继承。

外观模式

外观模式是迪米特法则的体现,通过引入一个新的外观角色可以降低原有系统的复杂度,同时将地客户类与子系统的耦合度。

定义
外部与一个子系统的通信通过一个统一的外观角色进行,为子系统中的一组接口提供一个一致的入口,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用,外观模式又称为门面模式,是一种对象结构型模式。

外观模式的目的在于降低系统复杂程度;

应用场景
1、当要为访问一系列复杂的子系统提供一个简单入口时可以使用外观模式;
2、客户端程序与多个子系统之间存在很大的依赖性,引入外观类可以将子系统与客户端解耦,从而提高子系统的独立性和可移植性。
3、在层次化结构中,可以使用外观模式定义系统中每一层的入口,层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度。

享元模式

享元模式以共享的方式高效地支持大量细粒度对象的重用,享元对象能够做到共享的关键是区分了内部状态和外部状态。

  1. 内部状态是存储在享元对象内部并且不会随环境改变而改变的状态,内部状态可以共享。
  2. 外部状态是随环境的改变而改变的、不可以共享的状态。享元对象的外部状态通常是由客户端保存,并在享元对象被创建之后需要使用的时候,在传入到享元对象内部。

通过向从享元池中取到的对象注入不同的外部状态,可以得到一系列相似的对象,而这些对象在内存中实际上只存储一份。

定义
运行共享技术有效的支持大量细粒度对象的复用。系统只使用少量的队形,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细粒度对象,因此又称为轻量级模式,是一种对象结构型模式。

单纯享元模式

所有的具体享元类都是可以共享的,不存在非共享具体享元类;

复合享元模式
将一些单纯享元对象使用组合模式加以组合,还可以型号才能复合享元对象,这样的复合享元对象本身能共享,但是它们可以分解成单纯享元对象,而后者则可以共享。

应用场景

  1. 一个系统有大量相同或相似的对象,造成内存的大量耗费;
  2. 对象的大部分状态都可以外部化,可以将这些外部状态转入内部对象;
  3. 在使用享元模式时需要维护一个存储享元对象的享元池,而这需要耗费一定的系统资源,因此,需要多次重复使用享元对象时才值得使用享元模式;

代理模式

定义
给某一个对象提供一个代理,并由代理对象控制对原对象的引用。是一种对象结构型模式。

远程代理
为一个位于不通地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以在同一台主机中,也可以在另一台主机中。远程代理又称为大使;

虚拟代理
如果需要创建一个资源消耗比较大的独享,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才被真正创建。

保护代理
控制对一个对象的访问,可以给不同用户提供不同级别的使用权限;

缓冲代理
为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果;

智能引用代理
当一个对象被引用时,提供一些额外的操作,如将对象被调用的次数记录下来。


职责链模式

定义
避免将请求发送者与接受者耦合在一起,让多个对象都有机会接收到请求,将这些对象连接成一条链,并且沿这这条链传递请求,直到有对象处理它为止,职责链模式是一种对象行为型模式。

纯的职责链模式
一个纯的职责链模式要求一个具体处理者对象只能在两个行为中选择一个,要么承担全部责任,要么将责任推给下家,不允许出现某一个具体处理者对象在承担一部分或全部责任后又将责任向下传递的情况。

不纯的职责链模式
在一个不纯的职责链模式中,允许某个请求被一个具体处理则部分处理后再向下传递。或者一个具体处理者处理完某请求后其后继处理者可以继续处理该请求,而且一个请求可以最终不被任何处理者对象所接收。

应用场景

  1. 有多个对象可以处理同一个请求,具体哪个对象处理该请求待运行时刻再确定,客户端只需将请求提交到链上,而无需关心请求的处理对象是谁以及它是如何处理的。
  2. 在不明确指定接受者的情况下,向多个对象中的一个提交一个请求。
  3. 可以动态指定一组对象处理请求,客户端可以动态创建职责链来处理请求,还可以改变链中处理者之间的先后次序。

命令模式

定义
将一个请求封装为一个对象,从而可用不同的请求对客户端进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作,命令模式是一种对象行为型模式,其别名为动作模式或事务模式。

核心在于引入了命令类,通过命令类来降低发送者和接收者的耦合度,请求发送者只需指定一个命令对象,在通过命令对象来调用请求接收者的处理方法。

本质是对请求进行封装,一个请求对应于一个命令,将发出命令的责任和执行命令的责任分隔开,每一个命令都是一个操作。

应用场景

  1. 系统需要将请求调用者和请求接受者解耦,使得调用者和接收者不直接交互,请求调用者无须知道接收者的存在,也无须知道接收者是谁,接收者也无须关心何时被调用。
  2. 系统需要在不同的时间指定请求、将请求排队和执行请求。一个命令对象和请求初始调用者可以有不同的声明期,换言之,最初的请求发出者可能已经不存在,而命令对象本身仍然是活动的,可以通过该命令对象去调用请求接收者,而无须关心请求调用者的存在性。
  3. 系统需要支持命令的撤销和恢复操作;
  4. 系统需要将一组操作组合在一个形成宏命令。

迭代器模式

定义

提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,别名为游标,是一种对象行为型模式。

应用场景

  1. 访问一个聚合对象的内容而无须暴露它的内部表示,将聚合对象的访问与内部数据的存储分离,使得访问聚合对象时无须了解其内部实现细节;
  2. 需要为一个聚合对象提供多种遍历方式;
  3. 为遍历不同的聚合结构提供一个统一的接口,在该接口的实现类中为不同的聚合结构提供不同的遍历方式,而客户端可以一致性地操作该接口。

中介者模式

定义
用一个中介对象来封装一系列的对象交互,中介者使各UI想不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互,又称为调停者模式,是一种对象行为型模式。

观察者模式

定义
定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新,别名为发布-订阅模式,模型-视图模式,源-监听器模式或者从属者模式,是一种对象行为型模式。

适用场景

  • 一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两个方面封装在独立的对象中使它们可以各自独立的改变和复用;
  • 一个对象的改变将导致一个或多个其他对象也发生改变,而并不知道具体有多少对象将发生改变,也不知道这些对象是谁;
  • 需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象…可以使用观察者模式创建一种链式触发机制。

策略模式

定义
定义一系列算法,将每一个算法封装起来,并让它们可以互相替换,策略模式让算法独立于使用它的客户而变化,也称为政策模式,是一种对象行为型模式。

适用场景

  • 一个系统需要动态地在几种算法中选择一种,那么可以将这些算法封装到一个个的具体算法类中,而这些具体算法类都是一个抽象算法类的子类。客户端可以选择使用任何一个具体算法类,并值需要维持一个数据类型是抽象算法类的对象。
  • 一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重选择语句来实现,此时,使用策略模式,把这些行为转移到响应的具体策略类里面,就可以避免使用难以维护的多重条件选择语句。
  • 不希望客户端知道复杂的、与算法相关的数据结构,再具体策略类中封装算法与相关数据结构,可以提高算法的保密性与安全性。

模板方法模式

定义
定义一个操作中算法的框架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤,是一种类行为型模式。

适用场景

  • 对一些复杂的算法进行分割,将其算法中固定不变的部分设计为模板方法和父类具体方法,而一些可以改变的细节由其子类来实现,即一次性地实现一个算法的不变部分,并将可变的行为留给子类来实现。
  • 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
  • 需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值