Java设计模式之装饰模式的原理及实现方法是什么?
1.什么是装饰模式
当我们想要改进或增强某个对象的功能,而又不想继承该类创建子类,可以考虑使用装饰模式。
使用装饰模式增强对象的某个功能,比生成子类再增强,更为灵活。
2.如何实现
1)抽象组件:定义一个抽象类,该抽象类定义了“被装饰者”需要被“装饰的方法”
2)具体组件:抽象组件的一个子类。成为“被装饰类”
3)装饰组件:也是抽象组件的一个子类。该类中持有“被装饰者”的引用,用来调用被装饰者的方法。可以为抽象类,也可以是非抽象类。
4)具体装饰类:是装饰组件的一个子类,被称为“装饰者”
3.代码实现
1)抽象组件
/** * 抽象组件,定义了被装饰类需要装饰的方法 */ public abstract class ICake { /** * 需要装饰的方法 * @return */ public abstract int getPrice(); }
2)被装饰者
/** * 被装饰者,是抽象组件的一个子类,定义需要被装饰的方法 */ public class Cake extends ICake { /** * 被装饰类中,装饰方法的基本实现 * @return */ @Override public int getPrice() { System.out.println("getPrice"); return 100; } }
3)装饰类
/** * 装饰类,也是抽象组件的一个子类。 * 可以是抽象类,也可以是非抽象类。 */ public abstract class CakeDecorator extends ICake { /** * 被装饰类的引用,需要在装饰类中,调用到被装饰类的方法。 */ ICake cake; public CakeDecorator(ICake cake){ this.cake = cake; } }
4)具体装饰
/** * 具体装饰类 */ public class BlueBerryCake extends CakeDecorator { public BlueBerryCake(ICake cake) { super(cake); } /** * 被装饰的方法 * 在调用到被装饰类的基础方法后,还要调用装饰类要增强的方法 * @return */ @Override public float getPrice(){ return cake.getPrice()+elsePrice(); } /** * 增强的方法 * @return */ private float elsePrice(){ System.out.println("else getPrice"); return 50; } }
5)测试类
public class TestDecorator { public static void main(String args[]){ ICake cake = new Cake(); CakeDecorator decorater = new BlueBerryCake(cake); float price = decorater.getPrice(); System.out.println(price); } }
4.拓展
1)利用子类继承也能实现某个方法的增强。相比通过装饰模式实现,装饰模式有和优势?
被装饰者和装饰者是松耦合关系。装饰类仅仅依赖于抽象组件,装饰类只需要知道被装饰类是抽象组件的一个子类,而不必知道具体是哪个子类。
装饰模式满足“开-闭原则”,不必修改具体组件,就可以增加针对该组件的装饰类。
5.JavaIo与装饰模式
java.IO包中的很多类使用了装饰模式。
Reader
FileReader
BufferdReader
以上是Java设计模式之装饰模式的原理及实现方法是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

Java 8引入了Stream API,提供了一种强大且表达力丰富的处理数据集合的方式。然而,使用Stream时,一个常见问题是:如何从forEach操作中中断或返回? 传统循环允许提前中断或返回,但Stream的forEach方法并不直接支持这种方式。本文将解释原因,并探讨在Stream处理系统中实现提前终止的替代方法。 延伸阅读: Java Stream API改进 理解Stream forEach forEach方法是一个终端操作,它对Stream中的每个元素执行一个操作。它的设计意图是处

Java是热门编程语言,适合初学者和经验丰富的开发者学习。本教程从基础概念出发,逐步深入讲解高级主题。安装Java开发工具包后,可通过创建简单的“Hello,World!”程序实践编程。理解代码后,使用命令提示符编译并运行程序,控制台上将输出“Hello,World!”。学习Java开启了编程之旅,随着掌握程度加深,可创建更复杂的应用程序。
