网站首页 > java教程 正文
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() + "元");
}
}
一起讨论学习的可以的点下关注,会持续更新,文章有用的话可以收藏,转发,有什么补充可以在下面评论,谢谢
- 上一篇: Java学习进阶:Java设计模式的6大原则
- 下一篇: 软帝学院:Java设计模式的6大原则
猜你喜欢
- 2024-11-26 Java设计模式——命令模式
- 2024-11-26 23种java设计模式之:建造者模式、工厂方法模式、抽象工厂模式
- 2024-11-26 3张思维导图说清楚:java设计模式的6大设计原则,前3讲!
- 2024-11-26 面试官:常见的开源框架用了哪些设计模式?
- 2024-11-26 Java面试题之Spring 用了哪些设计模式?
- 2024-11-26 Java设计模式学习总结:组合模式
- 2024-11-26 别错过了!牛人大神开始讲解java和设计模式(行为模式)
- 2024-11-26 阿瑟Java (38):比较几种常见的设计模式
- 2024-11-26 Java设计模式:模板方法模式、命令模式与中介者模式
- 2024-11-26 软帝学院:Java设计模式的6大原则
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)