前言

本篇来学习下结构型模式的外观模式和装饰器模式。

外观模式

简介

外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。

简单的来说就是对外提供一个简单接口,隐藏实现的逻辑。比如常用电脑的电源键,我们只需按电源键,就可以让它启动或者关闭,无需知道它是怎么启动的(启动CPU、启动内存、启动硬盘),怎么关闭的(关闭硬盘、关闭内存、关闭CPU);

这里我们还是可以用电脑玩游戏的例子来外观模式进行简单的讲解。

电脑上有一些网络游戏,分别是DNF、LOL和WOW,我们只需双击电脑上的图标就可以启动并玩游戏了,无需关心游戏是怎么启动和运行的了。

需要实现的步骤如下:建立游戏的接口;

建立LOL、DNF和WOW的类并实现游戏的接口;

定义一个外观类,提供给客户端调用。

调用外观类。

代码示例:interface Game{

void play();

}

class DNF implements Game{

@Override

public void play() {

System.out.println("正在玩DNF...");

}

}

class LOL implements Game{

@Override

public void play() {

System.out.println("正在玩LOL...");

}

}

class WOW implements Game{

@Override

public void play() {

System.out.println("正在玩WOW...");

}

}

class Computer{

private Game dnf;

private Game lol;

private Game wow;

public Computer() {

dnf=new DNF();

lol=new LOL();

wow=new WOW();

}

public void playDNF(){

dnf.play();

}

public void playLOL(){

lol.play();

}

public void playWOW(){

wow.play();

}

}

public static void main(String[] args) {

Computer computer=new Computer();

computer.playDNF();

computer.playLOL();

computer.playWOW();

}

运行结果:正在玩DNF...

正在玩LOL...

正在玩WOW...

在上述代码示例中,我们在想玩游戏的时候,只用实例化外观类调用其中的游戏方法即可,无需关心游戏是怎么启动和运行的。而且每个游戏之间也相互独立,互不影响,不会因为某个游戏玩不了导致其它的游戏也无法运行。其实感觉外观模式和我们平时使用接口很相像,都是对外提供接口,并不需要关心是如何实现的。

外观模式的优点:

降低了耦合,从某种方面来说也提升了安全性。

外观模式的缺点:

不符合开闭原则,不易更改。

使用场景      系统中有多个复杂的模块或者子系统的时候。

装饰器模式

简介

装饰器模式允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

装饰器模式,顾名思义,也就是把某个东西进行装饰起来,让它可以提供一些额外的功能。比如对人进行装饰,做不同的事情的时候穿上不同的服装。比如穿上球衣是准备去打球,穿上泳衣是准备去游泳之类的。

装饰器模式可以动态地给一个对象添加一些额外的职责。

这里我们依旧用一个示例来进行说明。

在现在的玩具模型中,有两种模型很受欢迎,高达(GUNDAM)模型和扎古(MrGu)模型,在我们拼接模型的时候,一般都是先将模型拼接好,然后再来添加一些额外的配件,比如武器。在这里我们在拼接好高达(GUNDAM)模型和扎古(MrGu)模型之后,给它们装上各自的武器。

具体实现的步骤如下:创建一个抽象构件的模型接口,有组装这个方法;

创建具体构件的类(GUNDAM类和MrGu类),并实现上述的模型接口;

定义一个装饰器,用于接受客户端的请求,并根据客户端的请求进行相应的调用;

定义个具体实现装饰的类,用于给对象添加相应的功能。

代码示例:interface Model{

void assemble();

}

class GUNDAM implements Model{

@Override

public void assemble() {

System.out.println("组装一个高达模型");

}

}

class MrGu implements Model{

@Override

public void assemble() {

System.out.println("组装一个扎古模型");

}

}

abstract class AddExtra implements Model{

protected Model model;

public AddExtra(Model model){

this.model=model;

}

public void assemble(){

model.assemble();

}

}

class LightSaber extends AddExtra{

public LightSaber(Model model) {

super(model);

}

public void assemble(){

model.assemble();

addLightSaber();

}

public void addLightSaber(){

System.out.println("添加光剑");

}

}

class RocketLauncher extends AddExtra{

public RocketLauncher(Model model) {

super(model);

}

public void assemble(){

model.assemble();

addRocketLauncher();

}

public void addRocketLauncher(){

System.out.println("添加火箭筒");

}

}

public static void main(String[] args) {

Model gundam=new GUNDAM();

Model mrgu=new MrGu();

gundam.assemble();

mrgu.assemble();

Model gModel=new LightSaber(new GUNDAM());

gModel.assemble();

Model mModel=new RocketLauncher(new MrGu());

mModel.assemble();

}

运行结果:组装一个高达模型

组装一个扎古模型

组装一个高达模型

添加光剑

组装一个扎古模型

添加火箭筒

在上述的代码中,我们如果只想组装高达或这扎古的模型的话,可以直接实例化模型类,调用其中的方法即可。假若需要在组装模型的时候,添加一个武器,只需通过装饰器的类进行相应添加相应的功能即可。

通过这个示例,我们发现,在使用装饰器模式的试试,可以对一些类进行扩展,并且不影响之前的功能,提升了灵活度。

装饰器模式的优点:

装饰类和被装饰类可以独立发展,耦合度低,易于扩展,灵活方便。

装饰器模式的缺点:

过多的对某个类进行装饰,会增加复杂度。

使用场景 原型不变,动态增加一些功能的时候

Java高架构师、分布式架构、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战学习架构师视频免费获取架构群:854180697    加群链接

写在最后:欢迎留言讨论,点“关注”,不迷路,加关注,持续更新!

利用外观模式Java投资理财_Java设计模式之外观模式和装饰器模式的设计(精选)...相关推荐

  1. 装饰器模式与代理模式的区别_JS设计模式(三):装饰器模式、代理模式

    Do more 做的更多,比你上级给你安排的任务! 前言 在<不止代码>中提到了几个程序员典型的思维误区: 「 拜大牛为师 」「 业务代码一样很牛逼 」「 上班太忙没时间学习 」 我之前也 ...

  2. Java设计模式之结构型:装饰器模式

    一.什么是装饰器模式: 当需要对类的功能进行拓展时,一般可以使用继承,但如果需要拓展的功能种类很繁多,那势必会生成很多子类,增加系统的复杂性,并且使用继承实现功能拓展时,我们必须能够预见这些拓展功能, ...

  3. 大聪明教你学Java设计模式 | 第七篇:装饰器模式

    前言 大聪明在写代码的过程中发现设计模式的影子是无处不在,设计模式也是软件开发人员在软件开发过程中面临的一般问题的解决方案.大聪明本着"独乐乐不如众乐乐"的宗旨与大家分享一下设计模 ...

  4. 设计模式系列:搞懂装饰器模式,增加自身技能

    装饰器模式的定义:指在不改变原有对象的基础上,动态地给该对象增加一些额外的功能的模式,属于对象结构型模式. 装饰器模式的核心在于类的扩展,通过装饰器模式可以透明且动态的扩展类的功能. 装饰器模式的结构 ...

  5. 设计模式学习(三)——装饰器模式

    前言 距离上一次正儿八经地写随笔已经有一段时间了,虽然2月10号有一篇关于泛型的小记,但是其实只是简单地将自己的学习代码贴上来,为了方便后续使用时查阅,并没有多少文字和理解感悟.之所以在今天觉得有必要 ...

  6. 从未这么明白的设计模式(三):装饰器模式

    本文原创地址:jsbintask的博客(食用效果最佳),转载请注明出处! 同系列文章: 从未这么明白的设计模式(二):观察者模式 从未这么明白的设计模式(一):单例模式 前言 装饰器模式是为了运行时动 ...

  7. 设计模式(十二)-装饰器模式(Decorator Pattern)——装饰边框与被饰物的一致性

    装饰器模式(Decorator Pattern)能不断的为对象添加装饰. Display.java package com.test.dp.Decorator.Sample;//抽象类,用于显示字符串 ...

  8. 原型模式 java 深浅_Java设计模式——原型模式

    原型模式(Prototype) 原型模式虽然是创建型的模式,但是与工程模式没有关系,从名字即可看出,该模式的思想就是将一个对象作为原型,对其进行复制.克隆,产生一个和原对象类似的新对象.本小结会通过对 ...

  9. java责任链模式做优惠_Java设计模式菜鸟系列(十八)责任链模式建模与实现

    责任链模式(ChainOfResponsibility): 有多个对象,每个对象持有下一个对象的引用,形成一条链,请求在这条链上传递,直到某一对象决定处理该请求,但是发出者并不清楚最终哪个对象会处理该 ...

  10. 原型模式 java 深浅_JAVA设计模式---原型模式--浅客隆和深克隆

    JAVA浅克隆和深克隆 浅克隆:被复制对象的所有变量和原来相同,而所有的对其他对象的引用仍指向原对象.即如果复制的对象修改复制对象的变量,原对象不会改变.而修改引用的对象,二者均会发生改变. 深复制( ...

最新文章

  1. 零基础入门学习Python(13)-字符串
  2. 从零开始入门 K8s | Kubernetes 网络概念及策略控制
  3. Numpy-矩阵的合并
  4. 平衡树 - FHQ 学习笔记
  5. Eclipse添加JDK源码
  6. (一)问候 Log4j 你好
  7. numpy:数组累乘
  8. 【中级计量经济学】Lecture 8 虚拟变量回归
  9. MySQL功能大全(细品)
  10. 房价会象汽车电脑一样下降
  11. Qt浅谈之三十系统托盘(QSystemTrayIcon)
  12. C++/Python中两个小于号或两个大于号的作用
  13. 通讯录版本1.0到3.0简易版
  14. 由开发者的人品问题领略测试人员的人品问题
  15. java 如何建立servlet_Servlet怎么新建
  16. 我,28岁,测试员,10月无情被辞:想给还在学测试 的人提个醒......
  17. 视频编码h264怎么看_新手怎么上高速,视频拍给你看
  18. 机器学习系列--Naive Bayes Classification
  19. 昆仑游戏CEO陈芳离职:黄新颖接任 全面负责Gameark工作
  20. 机器学习实战之支持向量机

热门文章

  1. vs2017配置 opengl + glfw + glad 环境
  2. 7-2 古风排版 C语言
  3. 高数-极限-求极限值--两个重要极限(以及拓展公式)
  4. ADO 笔记 ——关于RecordCount
  5. 2.reflect.TypeOf()
  6. android面试题之四(红黑联盟)
  7. 【raid5数据恢复案例】两组分别由4块SAS硬盘组成的raid5阵列,两组阵列组成lvm结构,出现故障后数据恢复方案
  8. 山大2019计算机学院夏令营,关于举办山东大学2019年环境学科优秀大学生暑期夏令营公告...
  9. layui 模板判断_layui之模板弹框
  10. Word VBA 表格宏处理