前言

上一篇中我们学习了结构型模式的适配器模式和桥接模式。本篇则来学习下结构型模式的外观模式和装饰器模式。

外观模式

简介

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

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

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

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

需要实现的步骤如下:

  1. 建立游戏的接口;
  2. 建立LOL、DNF和WOW的类并实现游戏的接口;
  3. 定义一个外观类,提供给客户端调用。
  4. 调用外观类。

代码示例:


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)模型之后,给它们装上各自的武器。

具体实现的步骤如下:

  1. 创建一个抽象构件的模型接口,有组装这个方法;
  2. 创建具体构件的类(GUNDAM类和MrGu类),并实现上述的模型接口;
  3. 定义一个装饰器,用于接受客户端的请求,并根据客户端的请求进行相应的调用;
  4. 定义个具体实现装饰的类,用于给对象添加相应的功能。

代码示例:


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();
}

运行结果:


组装一个高达模型
组装一个扎古模型 组装一个高达模型
添加光剑
组装一个扎古模型
添加火箭筒

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

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

装饰器模式的优点:

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

装饰器模式的缺点:

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

使用场景

原型不变,动态增加一些功能的时候。

其它

音乐推荐

原创不易,如果感觉不错,希望给个推荐!您的支持是我写作的最大动力!

版权声明:

作者:虚无境

博客园出处:http://www.cnblogs.com/xuwujing

CSDN出处:http://blog.csdn.net/qazwsxpcm 

个人博客出处:http://www.panchengming.com

Java进阶篇设计模式之五-----外观模式和装饰器模式的更多相关文章

  1. Java进阶篇设计模式之十三 ---- 观察者模式和空对象模式

    前言 在上一篇中我们学习了行为型模式的备忘录模式(Memento Pattern)和状态模式(Memento Pattern).本篇则来学习下行为型模式的最后两个模式,观察者模式(Observer P ...

  2. Java进阶篇设计模式之六 ----- 组合模式和过滤器模式

    前言 在上一篇中我们学习了结构型模式的外观模式和装饰器模式.本篇则来学习下组合模式和过滤器模式. 组合模式 简介 组合模式是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来 ...

  3. Java设计模式之五 ----- 外观模式和装饰器模式

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

  4. Java进阶篇 设计模式之十四 ----- 总结篇

    前言 本篇是讲述之前学习设计模式的一个总结篇,其目的是为了对这些设计模式的进行一个提炼总结,能够通过查看看此篇就可以理解一些设计模式的核心思想. 设计模式简介 什么是设计模式 设计模式是一套被反复使用 ...

  5. 深入探索Java设计模式(三)之装饰器模式

    装饰器模式使你可以在运行时使用类似于对象组成的技术来装饰类.这在我们希望实例化具有新职责的对象而无需对基础类进行任何代码更改的情况下尤其有用.本文是在学习完优锐课JAVA架构VIP课程—[框架源码专题 ...

  6. Java进阶篇设计模式之七 ----- 享元模式和代理模式

    前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...

  7. Java进阶篇设计模式之一 ----- 单例模式

    前言 在刚学编程没多久就听说过设计模式的大名,不过由于当时还是个彻彻底底的菜鸟,并没有去触碰.直到在开始工作中对简单的业务代码较为熟悉之后,才正式的接触设计模式.当时最早接触的设计模式是工厂模式,不过 ...

  8. Java设计模式(七)Decorate装饰器模式

    一.场景描述 (一)问题 系统中最初使用Crystal Report(水晶报表)工具生成报表,并将报表发送给客户端查看,此时定义一CrystalReport工具类即可完成水晶报表的生成工作. 后续报表 ...

  9. Java设计模式之(七)——装饰器模式

    1.什么是装饰器模式? Attach additional responsibilities to an object dynamically keeping the same interface.D ...

随机推荐

  1. CSS中的变形、过渡、动画效果

    一.变形 .过渡效果 1:元素平移 x方向 y方向 transform:translate(100px 100px); 2:过渡动画效果 a:什么属性参与过渡效果 b:过渡时间 c:过渡的效果 值包含 ...

  2. PAT1047: Student List for Course

    1047. Student List for Course (25) 时间限制 400 ms 内存限制 64000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Y ...

  3. CentOS6.5系统挂载NTFS分区的硬盘

    下载rpmforge,下载对应的版本,就是对应CentOS版本,还有32位与64位也要对应上.rpmforge拥有4000多种CentOS的软件包,被CentOS社区认为是最安全也是最稳定的一个软件仓 ...

  4. Unity文档阅读 第二章 依赖注入

    Introduction 介绍Chapter 1 outlines how you can address some of the most common requirements in enterp ...

  5. SSM-MyBatis-15:Mybatis中关联查询(多表操作)

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 先简单提及一下关联查询的分类 1.一对多 1.1单条SQL操作的 1.2多条SQL操作的 2.多对一 2.1单 ...

  6. .net关于坐标之间一些简单操作

    火星坐标系 (GCJ-02)转换为百度坐标系 (BD-09) function GCJ02toBD09(lng, lat) { var x_pi = 3.14159265358979324 * 300 ...

  7. Spring Boot 定制URL匹配规则的方法

    事情的起源:有人问我,说编写了一个/hello访问路径,但是吧,不管是输入/hello还是/hello.html,还是/hello.xxx都能进行访问.当时我还以为他对代码进行处理了,后来发现不是,后 ...

  8. Jquery样式

    css样式只有一个的时候: $(function(){ $('p').css('background-color','green'); }) css样式有多个的时候: $(function(){ $( ...

  9. Selenium webdriver定位iframe里面元素

    在查找元素过程中,直接通过id或者xpath等找不到元素,查看页面源代码发现元素是属于iframe里,例如: <div class="wrap_login"> < ...

  10. 关于top命令的使用

    在服务器运维过程中,我们有时需要知道当前状态下的系统运行性能,该如何获取呢?今天,咱们聊一下关于top这个小命令的一些知识. top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资 ...