网站首页 > 精选教程 正文
1 基本概括
2 主要介绍
2.1 概念
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。动态地将责任附加到对象上,若要扩展功能,装饰着提供了比继承更有弹性的替代方案
2.2 主要组成
在装饰模式中,一共有四个角色,分别是 抽象主体、具体主体、抽象装饰、具体装饰。
抽象主体:一个接口或抽象类,以规范需要装饰的主体类,比如:手抓饼
具体主体:具体的需要装饰的主体,比如,普通手抓饼
抽象装饰:持有抽象主体的实例,并实现或继承抽象主体。比如:抽象的材料
具体装饰:具体的装饰品,需继承或实现抽象装饰。表示具体的材料如鸡蛋,香肠等
装饰者设计模式的过程
2.3 应用场景
装饰者在代码程序中适用于以下场景:
1、用于扩展一个类的功能或给一个类添加附加职责。
2、动态的给一个对象添加功能,这些功能可以再动态的撤销。
2.4 优缺点
优点:
- 装饰者比继承灵活,可以在不改变原有对象的情况下动态地给一个对象扩展功能,即插即用非常方便
- 通过不同的装饰器组合,可以实现不同效果
- 装饰者完全遵守开闭原则。
缺点:
- 会增加程序复杂性,会增加更多的类
- 动态装饰时,操作多层装饰复杂
2.5 原则
- 封装变化
- 多用组合少用继承
- 针对接口编程,不针对实现编程
- 为了交互对象之间的松耦合而努力
- 类应该对扩展开放,对修改关闭
3 代码示例
3.1 实现过程
1. 手抓饼接口
/**
* 手抓饼接口
*/
public interface Cake {
public String getCake();
public double getPrice();
}
2. 基本手抓饼实现
/**
* 普通手抓饼5元
*/
public class BaseCake implements Cake{
@Override
public String getCake() {
return "手抓饼";
}
@Override
public double getPrice() {
return 5;
}
}
3. 加蛋装饰器
/**
* 加一个鸡蛋需要加2元
*/
public class AddEggCake implements Cake {
private Cake cake;
public AddEggCake(Cake cake){
this.cake = cake;
}
@Override
public String getCake() {
return cake.getCake() + " + 鸡蛋";
}
@Override
public double getPrice() {
return cake.getPrice() + 2;
}
}
4. 加香肠装饰器
/**
* 加一根肠需要加3元
*/
public class AddSusageCake implements Cake {
private Cake cake;
public AddSusageCake(Cake cake){
this.cake = cake;
}
@Override
public String getCake() {
return cake.getCake() + " + 肠";
}
@Override
public double getPrice() {
return cake.getPrice() + 3;
}
}
5. 测试类
public class Run {
public static void main(String[] args) {
//普通手抓饼
Cake cake1 = new BaseCake();
System.out.println("手抓饼:" + cake1.getCake() + ",需要支付" + cake1.getPrice() + "元");
//手抓饼+鸡蛋
Cake cake2 = new BaseCake();
cake2 = new AddEggCake(cake2);
System.out.println("手抓饼+鸡蛋:" + cake2.getCake() + ",需要支付" + cake2.getPrice() + "元");
//手抓饼+ 2个鸡蛋 + 一根肠
Cake cake3 = new BaseCake();
cake3 = new AddEggCake(cake3);
cake3 = new AddEggCake(cake3);
cake3 = new AddSusageCake(cake3);
System.out.println("手抓饼+2个鸡蛋+一根肠:" + cake3.getCake() + ",需要支付" + cake3.getPrice() + "元");
}
}
一起讨论学习的可以的点下关注,会持续更新,文章有用的话可以收藏,转发,有什么补充可以在下面评论,谢谢
- 上一篇: 9种设计模式在Spring中的运用,一定要非常熟练
- 下一篇: Java中的设计模式(一):观察者模式
猜你喜欢
- 2024-12-05 Java设计模式学习总结:组合模式
- 2024-12-05 趣谈 23 种设计模式(多图 + 代码)
- 2024-12-05 别错过了!牛人大神开始讲解java和设计模式(行为模式)
- 2024-12-05 你知道吗?Spring中都用到了那些设计模式?面试的时候慌了吗?
- 2024-12-05 Spring框架中都用到了哪些设计模式?
- 2024-12-05 Java中的设计模式(一):观察者模式
- 2024-12-05 9种设计模式在Spring中的运用,一定要非常熟练
- 2024-12-05 对java设计模式的理解、总结
- 2024-12-05 一文总结Java的23种设计模式
- 2024-12-05 java设计模式
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)