设计模式之装饰模式

装饰模式解析

定义:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。层层包装,增强功能。

在装饰模式中的各个角色有:

  (1)抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
  (2)具体构件(Concrete Component)角色:定义一个将要接收附加责任的类。
  (3)装饰(Decorator)角色:持有一个构件(Component)对象的实例,并实现一个与抽象构件接口一致的接口。
  (4)具体装饰(Concrete Decorator)角色:负责给构件对象添加上附加的责任。

这里写图片描述
“`
public abstract class Girl {
2
String description = “no particular”;
3

4
public String getDescription(){
5
return description;
6
}
7
}
AmericanGirl.java

1
public class AmericanGirl extends Girl {
2

3
public AmericanGirl() {
4
description = “+American”;
5
}
6

7
}
EuropeanGirl.java

1
public class EuropeanGirl extends Girl {
2

3
public EuropeanGirl(){
4
description = “+European”;
5
}
6

7
}
GirlDecorator.java

1
public abstract class GirlDecorator extends Girl {
2

3
public abstract String getDescription();
4

5
}
Science.java

01
public class Science extends GirlDecorator {
02

03
private Girl girl;
04

05
public Science(Girl girl){
06
this.girl = girl;
07
}
08

09
@Override
10
public String getDescription() {
11
return this.girl.getDescription() + “+Like Science”;
12
}
13

14
public void caltulateStuff() {
15
System.out.println(“scientific calculation!”);
16
}
17
}
Art.java

01
public class Art extends GirlDecorator {
02

03
private Girl girl;
04

05
public Art(Girl girl){
06
this.girl = girl;
07
}
08

09
@Override
10
public String getDescription() {
11
return this.girl.getDescription() + “+Like Art”;
12
}
13

14
public void draw() {
15
System.out.println(“draw pictures!”);
16
}
17
}
Main.java

01
public class Main {
02

03
public static void main(String[] args) {
04
//普通美国女孩
05
Girl g1 = new AmericanGirl();
06
System.out.println(g1.getDescription());
07

08
//喜欢科学的
09
Science g2 = new Science(g1);
10
System.out.println(g2.getDescription());
11

12
//喜欢艺术的
13
Art g3 = new Art(g2);
14
System.out.println(g3.getDescription());
15
}
16

17
}

/scienceGirl->artGirl->girl-> new ChinaGirl(); /

“public class DecoratorPattern {

public static void main(String[] args) {
    // TODO 自动生成的方法存根
    Girl girl = new ChinaGirl();
    System.out.println(girl.getDescription()); //China girl的getDescription


    GirlDecoator artGirl = new Art(girl);
    System.out.println(artGirl.getDescription());


    GirlDecoator scienceGirl = new Science(artGirl);
    System.out.println(scienceGirl.getDescription());

    /*scienceGirl->artGirl->girl-> new ChinaGirl(); */

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值