Java设计模式之装饰模式详解
1.什么是装饰模式
2.如何实现
3.代码实现
4.拓展
5.JavaIo与装饰模式
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设计模式之装饰模式详解的文章就介绍到这了,更多相关Java装饰模式内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!
相关内容
-
确定java按钮响应事件的代码
确定java按钮响应事件的代码,,* 阅读本文可以结合最后在java...
-
java电脑驱动下载|java驱动开发
java电脑驱动下载|java驱动开发,,1. java驱动开发你可以写一个...
-
java方法抽取快捷键|java获取返回值快捷键
java方法抽取快捷键|java获取返回值快捷键,,1. java获取返回值...
-
电脑无法运行java|电脑无法运行jar文件
电脑无法运行java|电脑无法运行jar文件,,1. 电脑无法运行jar文...
-
java开发用什么电脑好|JAVA开发用什么电脑
java开发用什么电脑好|JAVA开发用什么电脑,,1. JAVA开发用什么...
-
oracle中NUMBER类型和java中对应类型
oracle中NUMBER类型和java中对应类型,类型,数据类型,问题: 今...
-
java快捷键代码格式化|哪个快捷键可以将代码格
java快捷键代码格式化|哪个快捷键可以将代码格式化,,哪个快捷...
-
java生成注解快捷键|java生成注解快捷键是什么
java生成注解快捷键|java生成注解快捷键是什么,,1. java生成注...
-
JAVAscript里面的document.write是干什么
JAVAscript里面的document.write是干什么,内容,方法,本文目录J...
-
java如何换行快捷键|快捷键怎么快速换行
java如何换行快捷键|快捷键怎么快速换行,,1. 快捷键怎么快速换...
-
Java创建对象的几种方式
Java创建对象的几种方式,对象,方法,本文目录Java创建对象的几...
-
JavaScript里的document.querySelectorAll|是什
JavaScript里的document.querySelectorAll|是什么意思,方法,...
-
java模拟器电脑按键|java模拟器怎么使用
java模拟器电脑按键|java模拟器怎么使用,,1. java模拟器怎么使...
-
电脑启用java|电脑启用网络发现启用不了怎么办
电脑启用java|电脑启用网络发现启用不了怎么办,,电脑启用网络...
-
7723手机游戏网|7723手机游戏网JAVA
7723手机游戏网|7723手机游戏网JAVA,7723手机游戏网,不能掉下...