设计模式--装饰器模式
时间:2019-11-18
本文章向大家介绍设计模式--装饰器模式,主要包括设计模式--装饰器模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1、装饰模式
装饰模式:动态的给对象添加一些额外的职责,例如,给相片加各种不同的相框(相框就是装饰器)。
2、装饰模式的结构
-
角色
-
抽象组件(Component): 抽象组件定义了需要进行装饰的方法,也就是“被装饰者”角色;
-
具体组件(ConcreteComponent): 具体组件是抽象主件的一个子类;
-
装饰(Decorator):
-
具体装饰(ConcreteDecorator):具体装饰是”装饰“角色的一个非抽象子类。
-
-
类图
3、装饰模式举例
问题:给麻雀安装智能电子翅膀
抽象组件: Bird.java
1 package com.nick.pattern.decorator; 2 /** 3 * 抽象组件(被装饰者) 4 * 定义一个接口,接口中包括需要被装饰的一个抽象方法 5 * @author nick 6 */ 7 public interface Bird { 8 public abstract int fly(); 9 }
具体组件:Sparrow.java
1 package com.nick.pattern.decorator; 2 /** 3 * 具体组件(实现抽象组件) 4 * @author nick 5 */ 6 public class Sparrow implements Bird { 7 public final int DINSTANCE = 100; 8 @Override 9 public int fly() { 10 return DINSTANCE; 11 } 12 }
装饰器: Decorator.java
1 package com.nick.pattern.decorator; 2 /** 3 * 装饰(装饰具体组件,包含被装饰者的引用) 4 * @author nick 5 */ 6 public abstract class Decorator implements Bird { 7 Bird bird; //引用抽象组件 8 public Decorator(Bird bird) { 9 this.bird = bird; 10 } 11 public abstract int eleFly(); //装饰器中的装饰方法 12 }
具体装饰1:
1 package com.nick.pattern.decorator; 2 /** 3 * 具体装饰(装饰者的子类--电子翅膀) 4 * @author nick 5 */ 6 public class SparrowDecorator extends Decorator { 7 public final int DISTANCE = 50; //eleFly()方法(模拟电子翅膀)能飞50米 8 public SparrowDecorator(Bird bird) { 9 super(bird); 10 } 11 @Override 12 public int fly() { 13 int distance = 0; 14 distance = bird.fly() + eleFly(); 15 return distance; 16 } 17 @Override 18 public int eleFly() { 19 return DISTANCE; 20 } 21 }
具体装饰2:
1 package com.nick.pattern.decorator; 2 /** 3 * 具体装饰2(喷气装置) 4 * @author 5 */ 6 public class SparrowDecorator2 extends Decorator{ 7 public final int DISTANCE = 100; //eleFly()方法(模拟喷气装置)能飞20米 8 public SparrowDecorator2(Bird bird) { 9 super(bird); 10 } 11 @Override 12 public int fly() { 13 int distance=0; 14 distance = bird.fly()+eleFly(); 15 return distance; 16 } 17 @Override 18 public int eleFly() { 19 return DISTANCE; 20 } 21 }
主程序:
package com.nick.pattern.decorator; /** * 主程序 */ public class Application { public static void main(String[] args) { Bird bird = new Sparrow(); System.out.println("没安装电子翅膀的麻雀能飞行的距离:"+bird.fly()); bird = new SparrowDecorator(bird); System.out.println("安装1个电子翅膀的麻雀能飞行的距离:"+bird.fly()); bird = new SparrowDecorator(bird); System.out.println("安装2个电子翅膀的麻雀能飞行的距离:"+bird.fly()); bird = new SparrowDecorator2(bird); System.out.println("安装1个喷气装置后能飞行的距离:" +bird.fly()); } }
运行结果:
4、装饰器模式的优缺点
-
优点1:被装饰者和装饰者是弱耦合关系,由于装饰依赖于抽象组件,因此具体装饰只知道它要它要装饰的对象是抽象组件的某一个子类的实例,但不需要知道具体是哪一个具体的实例。
-
优点2:装饰模式满足“开-闭原则”。不必修改具体组件,就可以增加新的针对该组件的具体装饰。
-
优点3:可以使用多个具体装饰来装饰具体组件的实例。
原文地址:https://www.cnblogs.com/sinlearn/p/11881469.html
- 教你在Java接口中定义方法
- 【Spark研究】如何用 Spark 快速开发应用?
- 高性能Java解析器实现过程详解
- Java内存模型深度解读
- Java 实现线程死锁
- Java 四种线程池的用法分析
- 深入了解Java对象序列化
- 在Java EE7框架中使用MongoDB
- 用事实说话,成熟的ORM性能不是瓶颈,灵活性不是问题:EF5.0、PDF.NET5.0、Dapper原理分析与测试手记
- iPhone的Wi-Fi芯片漏洞利用POC公布,赶紧更新系统吧
- No.003 Longest Substring Without Repeating Characters
- 【Spark研究】极简 Spark 入门笔记——安装和第一个回归程序
- 通常Java开发人员如何进行数据排序?
- 消息服务框架使用案例之--大文件上传(断点续传)功能
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法