装饰者模式简单示例(二)
时间:2019-02-21
本文章向大家介绍装饰者模式简单示例(二),主要包括装饰者模式简单示例(二)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
例子来源:《设计模式之禅》——第17章 装饰者模式
装饰者模式的通用类图:
Component抽象构件
Component是一个接口或者是抽象类,就是定义我们最核心的对象,也就是最原始的对象。
ConcreteComponent具体构件
ConcreteComponent是最核心、最原始、最基本的接口或抽象类的实现,你要装饰的就是它。
Decorator装饰角色
一般是一个抽象类,实现接口或者抽象方法,它里面不一定有抽象方法,必然有一个指向Component抽象构件。
具体的装饰角色
ConcreteDecoratorA和ConcreteDecoratorB是两个具体的装饰类,需要把最核心、最原始的、最基本的东西装饰成其他东西。
抽象构件
public abstract class Component {
/**
* 抽象方法
*/
public abstract void operate();
}
具体构件
public class ConcreteComponent extends Component {
/**
* 具体实现
*/
@Override
public void operate() {
System.out.println("do something");
}
}
抽象装饰者
public abstract class Decorator extends Component {
private Component component = null;
/**
* 通过构造函数传递被修饰者
* @param component
*/
public Decorator(Component component) {
this.component = component;
}
/**
* 委托给被修饰者执行
*/
@Override
public void operate(){
this.component.operate();
}
}
具体的装饰类
public class ConcreteDecoratorA extends Decorator {
/**
* 通过构造函数传递被修饰者
*
* @param component
*/
public ConcreteDecoratorA(Component component) {
super(component);
}
/**
* 定义自己的修饰方法
*/
private void method1() {
System.out.println("method1 修饰");
}
/**
* 重写父类的Operate方法
*/
@Override
public void operate() {
this.method1();
super.operate();
}
}
public class ConcreteDecoratorB extends Decorator {
/**
* 通过构造函数传递被修饰者
*
* @param component
*/
public ConcreteDecoratorB(Component component) {
super(component);
}
/**
* 定义自己的修饰方法
*/
private void method2() {
System.out.println("method2 修饰");
}
/**
* 重写父类的Operate方法
*/
@Override
public void operate() {
super.operate();
this.method2();
}
}
测试类
public class Client {
public static void main(String[] args) {
Component component = new ConcreteComponent();
// 第一次修饰
component = new ConcreteDecoratorA(component);
// 第二次修饰
component = new ConcreteDecoratorB(component);
// 修饰后运行
component.operate();
}
}
output:
method1 修饰
do something
method2 修饰
装饰模式的优点
- 装饰类和被装饰类可以独立发展,而不会相互耦合。换句话说,Component类无须知道Decrator类,Decrator类是从外部来扩展Component类的功能,而Decrator也不用知道具体的构件。
- 装饰模式是继承关系的一个替代方案。我们看装饰类Decrator,不管装饰多少层,返回的对象还是Component,实现的还是is-a的关系。
- 装饰模式可以动态地扩展一个实现类的功能。
- WordPress评论ajax动态加载,解决静态缓存下评论不更新问题
- WordPress显示访客UA信息:Show UserAgent纯代码轻度汉化版
- WordPress开启颜色评论但不造成XSS漏洞的小方法
- WordPress强迫症技巧:让文章(ID)地址完美连续(障眼法)
- iOS内存管理:从MRC到ARC实践
- MySQL错误修复:Table xx is marked as crashed and last (automatic?) repair failed
- PHP跨站脚本攻击(XSS)漏洞修复方法(一)
- Windows下获取网络连线实际名称,加强IP类设置脚本的兼容性
- Android APP 快速 Pad 化实现
- PHP彩蛋还是漏洞?expose_php彩蛋的触发和屏蔽方法
- 深入源码探索 ReactNative 通信机制
- PHP跨站脚本攻击(XSS)漏洞修复思路(二)
- WordPress发布文章自动同步到新浪微博(带特色图片)
- go http 服务器编程(1)
- 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 数组属性和方法