前言

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

外观模式

简介

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

简单的来说就是对外提供一个简单接口,隐藏实现的逻辑。比如常用电脑的电源键,我们只需按电源键,就可以让它启动或者关闭,无需知道它是怎么启动的(启动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. Java设计模式之五 ----- 外观模式和装饰器模式

    前言 在上一篇中我们学习了结构型模式的适配器模式和桥接模式.本篇则来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这 ...

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

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

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

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

  4. 设计模式之门面模式与装饰器模式详解和应用

    目录 1 门面模式定义 1.1 门面模式的应用场景 1.2 门面模式的通用写法 1.3 门面模式业务场景实例 1.4 门面模式在源码中的应用 1.5 门面模式的优缺点 2 装饰器模式 2.1 装饰器模 ...

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

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

  6. java模式之装饰器模式

    定义: 装饰器模式也叫作包装器模式,只在不改变原有对象的基础上,动态的给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比生成子类更为灵活,属于结构型设计模式 装饰器模式提供了比继承更有弹性的 ...

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

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

  8. 代理模式与装饰器模式有何区别?

    本文有一些争议,谈论的是设计模式中的代理模式和装饰器模式的区别,但笔者是非常赞同文章的观点的,有种豁然开朗的感觉. 以下是原文 代理模式与装饰器模式有何区别? 我想有必要对此问题谈一下我的个人理解,若 ...

  9. Java设计模式学习总结(11)——结构型模式之装饰器模式

    装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.这种模式创建了一个装饰类,用来包装原 ...

最新文章

  1. Apache部署网页-Ubuntu16.04
  2. pacemaker+corosync
  3. Linux指令:tar打包与压缩
  4. pycharm 快捷使用
  5. 最近完成的一个可伸缩性的WEB开发框架
  6. 这『六本』电子书能帮助你成为优秀的程序员(含下载地址)
  7. 剑指offer面试题58 - I. 翻转单词顺序(双指针)
  8. 时间序列分析ARMA模型-学习笔记
  9. 信息化管理系统在企业的应用
  10. Linux下C++ libtorrent库使用
  11. 算法学习-求平方根函数
  12. 员工年终绩效考核表模板
  13. light动名词_—Thelightintheofficeisstillon.—Oh,Iforgot_____.[ ]A.tur
  14. 史上最全网址导航大全,让世上没有找不到的好东西
  15. vb.net 图片水平翻转_犁耕作业效果差?试试大马力拖拉机液压翻转犁正确调整与使用方法...
  16. 智能营销文本生成项目知识点总结
  17. 集合添加元素python_Python 集合(set)添加元素-Python 集合(set) add-Python 集合(set) update-嗨客网...
  18. 百度地图根据经纬度获取国家、州市等地址相关信息
  19. k8s 命令 重启_k8s常用命令
  20. 佳能Canon LBP9900C 打印机驱动

热门文章

  1. 国产操作系统可以基于BSD开发再闭源吗?
  2. 深入Java调试体系之JDWP协议及实现
  3. 工作流引擎在视频网站架构中的应用
  4. servlet 访问项目
  5. 100教育:一场与信任赛跑的赌注
  6. [企业化NET]Window Server 2008 R2[1]-服务器基本安装即问题解决记录
  7. python错误找回_致命的Python错误:无法从堆栈溢出中恢复。洪水期间Fi
  8. sql计算留存_免费教程《图解SQL面试题》
  9. application配置token_Kerrigan:配置中心管理UI的实现思路和技术细节
  10. 联想拯救者y7000怎么配置Java环境_联想拯救者y7000重装系统教程