关注微信公众号
动态地给一个对象添加一些额外的职责。就增加功能来说, D e c o r a t o r模式相比生成子类更为灵活。
以下情况使用D e c o r a t o r模式
• 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
• 处理那些可以撤消的职责。
• 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。
另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
输出语句如下:
住在北京路那里的人的房租3000.0
住在北京路那里的人的房租1楼5000.0
住在北京路那里的人的房租2楼4000.0
public
class
Test {
public
static
void
main(String[] args) {
Peopleo p=
new
Peopleo();
System.out.println(p.name()+p.price());
BeiJinLu1 A=
new
BeiJinLu1(p);
System.out.println(A.name()+A.price());
BeijinLu2 B=
new
BeijinLu2(p);
System.out.println(B.name()+B.price());
}
//要添加的附加功能的接口,抽象被装饰者接口,地址这个接口,存放了地址跟房租的价格两个成员
public
static
interface
Address {
public
String name();
public
float
price();
}
//新建一个具体的装饰者类,因为接口不能被new,只能子类化,这个子类设置了两个基本参数.创建了People其实也就是跟接口绑定了同个内存地址
static
class
Peopleo
implements
Address{
@Override
public
String name() {
return
"住在北京路那里的人的房租"
;
}
@Override
public
float
price() {
return
3000f;
}}
//抽象的北京路,核心的类
//实现了Address并且具备了Address作为自己的成员,抽象类实现抽象接口,就要实现抽象的方法,而抽象方法的返回值,设置为接口的方法
static
abstract
class
BeijinLu
implements
Address{
private
Address a;
public
BeijinLu(Address a) {
super
();
this
.a = a;
}
@Override
public
String name() {
return
a.name();
}
@Override
public
float
price() {
return
a.price();
}
}
//具体子类--北京路1楼
public
static
class
BeiJinLu1
extends
BeijinLu{
public
BeiJinLu1(Address a) {
super
(a);
}
@Override
public
String name() {
return
super
.name()+
"1楼"
;
}
@Override
public
float
price() {
return
super
.price()+2000f;
}
}
//具体子类--北京路2楼
public
static
class
BeijinLu2
extends
BeijinLu{
public
BeijinLu2(Address a) {
super
(a);
}
@Override
public
String name() {
return
super
.name()+
"2楼"
;
}
@Override
public
float
price() {
return
super
.price()+1000f;
}
}
}